Compare commits

...

251 Commits

Author SHA1 Message Date
Janet B. Anderson
2be40c2ade cvs now ignores the O.* directories. 1995-12-07 21:15:56 +00:00
Janet B. Anderson
2228ec3417 Moved from base/man. Man pages are now installed. 1995-12-07 21:08:25 +00:00
Janet B. Anderson
f8dd9b2bf7 Added man pages. Man pages are now installed. 1995-12-07 21:03:27 +00:00
Janet B. Anderson
4c5497c74e Moved from base/man. Man pages are now installed. 1995-12-07 21:02:20 +00:00
Janet B. Anderson
02feda47e1 Added man files. Man files are now installed. 1995-12-07 20:54:39 +00:00
Janet B. Anderson
cf209e1411 Moved from base/man. base/man is now a created directory. 1995-12-07 20:53:06 +00:00
Janet B. Anderson
c00216a941 DEC Unix (alpha) changes. 1995-12-07 19:29:17 +00:00
Marty Kraimer
b3726f1cb4 Fixed errors in initCommon 1995-12-05 14:00:36 +00:00
John Winans
c3ea9b769e *** empty log message *** 1995-12-04 17:13:13 +00:00
Marty Kraimer
4e1826d238 If device support is empty list dont allocate pdbDeviceMenu->papChoice 1995-12-04 15:10:39 +00:00
Marty Kraimer
2792f1fc6b DTYP for fields that have no devixe support was incorrect 1995-12-04 15:08:14 +00:00
Marty Kraimer
7a51dc30f2 e_flex and antelope are now epics default 1995-12-01 21:44:27 +00:00
Marty Kraimer
01a4f1f64b Moved sf2db to here 1995-12-01 21:42:15 +00:00
Marty Kraimer
144397decb EFLEX and Antelope are now defaults 1995-12-01 21:40:57 +00:00
Janet B. Anderson
edcd482415 Added rule for dbCommon.ascii 1995-12-01 17:11:34 +00:00
Marty Kraimer
2b7d67509e change pdbBase to pdbbase 1995-12-01 16:59:24 +00:00
Marty Kraimer
e113a5bed2 Change pdbBase to pdbbase 1995-12-01 16:57:49 +00:00
Marty Kraimer
ebd6a8d8ca change pdbbase to pdbBase 1995-12-01 16:56:50 +00:00
Janet B. Anderson
4407b2f24f Modified method of building and installing. 1995-11-30 22:50:42 +00:00
Janet B. Anderson
0a9a3422b8 Added PROD line for LIBOBJS. 1995-11-30 22:07:10 +00:00
Marty Kraimer
e96488dbb6 initial for menus was missing 1995-11-30 22:00:53 +00:00
Marty Kraimer
09b0f88c24 Forgot initial for CHOICE types 1995-11-30 21:59:22 +00:00
Marty Kraimer
83ee1e7a8a Make output file appear in directory in which makeBpt is executed 1995-11-30 21:58:11 +00:00
Marty Kraimer
df60df8a94 Added dbAsciiExpand and add path ./base/rec and ./rec for include 1995-11-30 19:37:13 +00:00
Johnny Tang
c3a7602526 bug fix 1995-11-30 17:29:29 +00:00
Jeff Hill
5d91c2f5f3 doc updated 1995-11-29 19:34:59 +00:00
Jeff Hill
3b6fc10bfe cleaned up interface to recv() and send() 1995-11-29 19:26:01 +00:00
Janet B. Anderson
a043177422 Added USR_LDFLAGS = -L. statement. 1995-11-29 19:19:59 +00:00
Jeff Hill
f4a34606e1 Added $log$ 1995-11-29 19:19:05 +00:00
Jeff Hill
3df522162b more tests 1995-11-29 19:17:25 +00:00
Jeff Hill
c0e611dcb8 added $Log$ to the header 1995-11-29 19:15:42 +00:00
Jeff Hill
1a133c65bb added envData.c to the FTP script 1995-11-29 19:09:26 +00:00
Jeff Hill
40237457e9 dont use bzero() 1995-11-29 19:08:21 +00:00
Jeff Hill
a9f37ef407 fixed bug where ca_array_get() of data type string returned only one string 1995-11-29 19:07:24 +00:00
Marty Kraimer
a2b2fe76fd remove #define LOCAL 1995-11-29 18:50:01 +00:00
Marty Kraimer
75d1f5ef3e added 1995-11-29 17:03:10 +00:00
Marty Kraimer
e25aa85707 Added for old 1995-11-29 16:58:26 +00:00
Marty Kraimer
93b26eee79 Changes for replacing default.dctsdr: Renamed all record support modules 1995-11-29 14:45:30 +00:00
Marty Kraimer
fb6f4ce704 Changes for replacing default.dctsdr by all ascii files 1995-11-29 14:38:52 +00:00
Marty Kraimer
8d8f5754a1 Changes for replacing default.dctsdt by all ascii files 1995-11-29 14:36:02 +00:00
Marty Kraimer
6c1d42f41d Changes for replacing default.dctsdr by all ascii files 1995-11-29 14:27:19 +00:00
Marty Kraimer
0bad952311 Changes for replacing default.dctsdr bu all ascii files 1995-11-29 14:18:16 +00:00
Janet B. Anderson
6128d3ac15 Commented out prototype def for yyparse. Prototype def in parse.c. 1995-11-28 22:02:39 +00:00
Janet B. Anderson
13c861d190 Removed CMPLR=STRICT statement. 1995-11-28 22:01:40 +00:00
Janet B. Anderson
5aeafaf416 Fixed comments on #endif statements 1995-11-28 18:33:00 +00:00
Jeff Hill
c3081b11d6 included <arpa/inet.h> 1995-11-27 22:49:36 +00:00
John Winans
ef13c2bb75 Added raw reading capability to the waveform record support. 1995-11-27 22:13:22 +00:00
Janet B. Anderson
b2ad0b6e1d Added sgi to case statement. 1995-11-27 15:49:58 +00:00
Janet B. Anderson
636c7ba56c Added SGI to ifdef 1995-11-27 15:47:06 +00:00
Andrew Johnson
1f61d4acc2 Added CANbus driver (TIP810 Industry-Pack).
N.B. drvIpMv162 is not tested.
1995-11-14 20:18:07 +00:00
Andrew Johnson
6b0f997b20 Added CANbus device support 1995-11-14 20:04:42 +00:00
cvs2svn
0f0083ce46 This commit was manufactured by cvs2svn to create tag 'R3.12.2'. 1995-11-13 16:55:04 +00:00
Janet B. Anderson
25a6340993 Added filio.h include for solaris build. 1995-11-13 16:55:03 +00:00
Jeff Hill
a3652fd54e improvents for better client reconnect 1995-11-08 23:48:26 +00:00
Jeff Hill
107ae2cee8 fixed log client reconnect problems 1995-11-08 23:46:27 +00:00
Jeff Hill
deb5e9c973 add log entries 1995-11-08 23:45:10 +00:00
Jeff Hill
196f2302a4 changes associated with fixing the log client 1995-11-08 23:44:41 +00:00
Jeff Hill
2a21b01b0e fixed bug occuring when diagnostic is printed and the env var cant be found 1995-11-08 23:43:51 +00:00
Jeff Hill
56465da07f log entries changed 1995-11-08 23:38:41 +00:00
Jeff Hill
ee9457970a changes froim chris T 1995-11-08 23:36:31 +00:00
Jeff Hill
89a3746869 changes from Chris T 1995-11-08 23:20:56 +00:00
Janet B. Anderson
5be8f4999d Removed "-s" compile option 1995-11-08 19:28:51 +00:00
Marty Kraimer
b278c803ce When calling db_post_event for argument fields ass DBE_LOG 1995-11-08 15:01:36 +00:00
Jeff Hill
50b8361078 more changes from Chris Timossi 1995-10-25 16:46:01 +00:00
Jeff Hill
2a121a4276 changes from Chris Timossi 1995-10-24 21:21:31 +00:00
Jeff Hill
7b03ab0182 Changes to avoid spurious ECONREFUSED returned from recvfrom() under linux 1995-10-22 22:27:47 +00:00
cvs2svn
73a224a6ce This commit was manufactured by cvs2svn to create tag 'R3.12.1.4'. 1995-10-20 20:21:33 +00:00
Marty Kraimer
f4af420e22 Changes to make stop work 1995-10-20 20:21:32 +00:00
Janet B. Anderson
b0177729b8 Sequencer V1.9.0(3.12.1) form lanl. 1995-10-19 21:35:38 +00:00
Jeff Hill
c7b5592846 make certain we dont use CPU while waiting for a flush to complete 1995-10-19 20:37:19 +00:00
Janet B. Anderson
2f5202a4e4 Assume no DST if tsMinWest is 600 (includes Hawaii and may be exclusively
Hawaii?). (WFL, 95/08/15)
1995-10-19 13:54:50 +00:00
Ned Arnold
ecb106fb71 WAIT Record Version 3.01, channel access dynamic links 1995-10-19 13:42:38 +00:00
Ned Arnold
b637c15e18 SCAN Record Version 3.00. Many changes. 1995-10-19 13:41:47 +00:00
Jeff Hill
d1102b06c0 recv task is now running at a lower priority than the send task under vxWorks 1995-10-18 16:49:23 +00:00
Jeff Hill
2fb23fd27b Use recast delay greater than one vxWorks tick 1995-10-18 16:45:40 +00:00
Jeff Hill
752b7e257e select time out must be greater than a vxWorks tick 1995-10-18 16:44:36 +00:00
John Quintana
025b13b977 *** empty log message *** 1995-10-12 20:50:36 +00:00
Jeff Hill
4c2822dd2e added SOLARIS ifdef around ioctl includes 1995-10-12 18:55:22 +00:00
Jeff Hill
9dcee4c068 removed unused variable 1995-10-12 18:54:41 +00:00
Janet B. Anderson
9bf802557e Updated for R3.12.1.3 1995-10-12 17:09:20 +00:00
Jeff Hill
2566ee1e26 If the IOC is out of memory allow them to connect if they stop
some of the clients.
1995-10-12 01:40:48 +00:00
Jeff Hill
5a16ba053b Changes from Bob Dalesio:
lrd     fix init to limit in overshoot check and retry post monitors
	   for mcw and mccw reprocess records if the setpoint changed
	   while they were moving
1995-10-12 01:38:41 +00:00
Jeff Hill
ad3e5a3272 New ca_flush_io() mechanism 1995-10-12 01:36:39 +00:00
Jeff Hill
17511136a1 Use of port is consistent unsigned short now 1995-10-12 01:36:13 +00:00
Jeff Hill
ffa22f89bd Moved cac_mux_io() to iocinf.c 1995-10-12 01:35:33 +00:00
Jeff Hill
2e7075bd31 Dont include filio.h and sockio.h. They are included by ioctl.h
and dont exist under linux.
1995-10-12 01:34:00 +00:00
Jeff Hill
278eaf84d7 Initial delay between search frames went from .1 to .01 sec,
Added flush pending flag, Make all usage of port be unsigned short.
1995-10-12 01:33:12 +00:00
Jeff Hill
d957aebbf4 make the use of unsigend short for a port consistent. Moved
cac_mux_io() out of os dependent code and into this module.
Added caSendMsgPending() routine.
1995-10-12 01:31:54 +00:00
Jeff Hill
5ac2a99686 improved the test 1995-10-12 01:30:28 +00:00
Jeff Hill
b782f63a7d new ca_flush_io() mechanism prevents deadlock when they call
ca_flush_io() from within an event routine. Also forces early
transmission of leading search UDP frames.
1995-10-12 01:30:10 +00:00
Marty Kraimer
e62f7d0ae2 cvtDoubleToString: honor precision for wierd numbers 1995-10-11 19:42:52 +00:00
Marty Kraimer
1ca96e0116 recGblGetAlarmDouble was not setting upper_warning_limit and lower_alarm_limit 1995-10-11 19:41:22 +00:00
Andrew Johnson
44d65d9477 Fixed main() for use as host tool - was *really* broken. 1995-10-04 20:42:05 +00:00
Andrew Johnson
dc3ba94fc8 Updated for Solaris Native mode compilation instructions. 1995-10-03 22:52:50 +00:00
Andrew Johnson
41ad7ae2ab Generating LIBOBJS automatically from SRCS.c 1995-10-03 21:18:50 +00:00
Andrew Johnson
017c55f9d9 Generating TARGETS automatically from SRCS.c 1995-10-03 21:13:45 +00:00
Andrew Johnson
196d7538c3 Generating LIBOBJS automatically from SRCS.c 1995-10-03 21:04:57 +00:00
Andrew Johnson
5ace66b609 Generating LIBOBJS automatically from SRCS.c 1995-10-03 20:59:44 +00:00
cvs2svn
0be218bed4 This commit was manufactured by cvs2svn to create tag 'R3.12.1.3'. 1995-10-03 15:42:27 +00:00
Janet B. Anderson
297f0b8c31 Added *COPYRIGHT* files to release tar file. 1995-10-03 15:42:26 +00:00
Jeff Hill
cc20412693 added locking for previous change 1995-09-29 22:53:38 +00:00
Jeff Hill
7021cd3589 use unsigned short for port 1995-09-29 22:18:53 +00:00
Jeff Hill
b7acf453c2 added arch independent type 1995-09-29 22:17:57 +00:00
Jeff Hill
c9abc2c82e ms windows changes 1995-09-29 22:17:13 +00:00
Jeff Hill
a7484494c4 changes from LBL 1995-09-29 22:15:26 +00:00
Jeff Hill
52cfbe92bf check for nill dbr pointer 1995-09-29 22:13:59 +00:00
Jeff Hill
75f0fb2b0c allow server to refuse to create a channel without a client disconnect 1995-09-29 22:13:05 +00:00
Jeff Hill
ed36723d6c ms windows changes 1995-09-29 21:58:16 +00:00
Jeff Hill
f7a5da9139 added minor version 6 which allows the server to refuse to create a channel
without disconnecting the client
1995-09-29 21:57:11 +00:00
Jeff Hill
254c5b1620 added func proto for cacDisconnectChannel() 1995-09-29 21:55:38 +00:00
Jeff Hill
c6aab85d79 MS windows changes and added cacDisconnectChannel() 1995-09-29 21:54:40 +00:00
Jeff Hill
d54724fce1 MS windows changes 1995-09-29 21:48:33 +00:00
Jeff Hill
60c0acab3c MS windows changes 1995-09-29 21:47:58 +00:00
Jeff Hill
69f33b9e23 alignment fix for SPARC IOC client and changes to prevent running of
access rights or connection handlers when the connection is lost just
after deleting a channel
1995-09-29 21:47:33 +00:00
Janet B. Anderson
9191863094 Added test for Linux. 1995-09-27 22:09:43 +00:00
Marty Kraimer
1beb157ab0 new database access has units as 16 char null terminated. old has 8 char null 1995-09-27 19:54:50 +00:00
Marty Kraimer
41ae285075 copy units string using DB_UNITS_SIZE 1995-09-27 19:52:45 +00:00
John Winans
222063ac53 Added code to send last byte of a RAC_RESET in pepTxTask(). It was left
out in a previous mod that modes the last byte transmission into a locked
region in order to prevent a TxTask/RxTask race condition.
1995-09-26 14:50:31 +00:00
Janet B. Anderson
3342ca120f Specified return type of functions. 1995-09-21 19:48:26 +00:00
cvs2svn
13b785e594 This commit was manufactured by cvs2svn to create tag 'R3.12.1.2'. 1995-09-13 18:27:49 +00:00
Jim Kowalkowski
6931273fef New utilities to list PVs on an IOC and loaded applications. 1995-09-13 18:27:48 +00:00
Jim Kowalkowski
8d52177933 Fixed the address of ioc by name in BSlib.c.
Added app list to the services of PVSvx.
Removed rdbls from PVSserver - made it a separate file.
1995-09-13 18:26:42 +00:00
Jim Kowalkowski
b64fa8bd87 Fixed bug in TSinit - Gives defaults to TSdirectTime() and TSdriverInit() if
event time disabled with TSconfigure().
1995-09-12 15:01:09 +00:00
Janet B. Anderson
34ce2ab6ac Added include for sockio and a cast for tsin in memset. 1995-09-08 14:56:30 +00:00
Jim Kowalkowski
43ef20b90c Completed first version of vx info server and workstation utility.
Removed the stupid program PVSget.
1995-09-07 21:25:59 +00:00
Jim Kowalkowski
818bc0d475 New library and PV dump programs for IOC and client workstation 1995-09-06 21:06:07 +00:00
Jim Kowalkowski
ca2f9aff52 Corrected a problem with building dbLoadTemplate/subtool.
Added the BS and PVS test functions
1995-09-06 21:05:09 +00:00
Jim Kowalkowski
64a93df872 Changed the error message 1995-09-06 21:04:22 +00:00
Jim Kowalkowski
ecc03e9ad9 Cleanup and addition of application() to db file 1995-09-06 21:03:07 +00:00
John Winans
db1b46e5f9 Added ability to change default clock speed from shell. 1995-09-01 14:36:35 +00:00
Marty Kraimer
d87295397e Still new 1995-09-01 14:35:27 +00:00
Marty Kraimer
7277c336f7 Fixed bug causing memory problem 1995-09-01 14:31:32 +00:00
Marty Kraimer
30ad5b1149 Added so that individual files dont have to have long notice 1995-09-01 12:47:28 +00:00
Marty Kraimer
c6bcd1a10b Still new 1995-08-30 21:31:43 +00:00
Marty Kraimer
f3cf369071 made separate from recDynLink 1995-08-30 21:18:29 +00:00
Marty Kraimer
adffe02a2d Still new 1995-08-30 21:17:46 +00:00
Marty Kraimer
e635080cef Fixed problems with freeing pvd 1995-08-30 17:43:19 +00:00
Jim Kowalkowski
be85da6a3a *** empty log message *** 1995-08-30 15:38:39 +00:00
Marty Kraimer
c16006f34d recDynLink is new 1995-08-29 17:55:20 +00:00
Janet B. Anderson
72491d8829 Added startup directory to release tar file 1995-08-28 15:49:54 +00:00
Marty Kraimer
cb78c5adb8 Changes so that function prototype for db_post_event defined 1995-08-28 14:50:32 +00:00
Jeff Hill
1a2cd5953d added log entries 1995-08-23 00:35:17 +00:00
Jeff Hill
5da79a5f56 fixed vxWorks specific SPARC data alignment problem 1995-08-23 00:34:06 +00:00
Jeff Hill
9f2d9587f0 additional parenthesis in macro to be safe 1995-08-23 00:31:13 +00:00
cvs2svn
74e405969a This commit was manufactured by cvs2svn to create tag 'R3.12.1.1'. 1995-08-22 12:23:38 +00:00
Marty Kraimer
89a6d17353 Added argument verbose to dbPvdDump 1995-08-22 12:23:37 +00:00
Jeff Hill
d9666a8f30 added cvs style mod log 1995-08-22 00:27:59 +00:00
Jeff Hill
7cb76ae9e4 dont recompute connection time outs if the time stamp doesnt change 1995-08-22 00:25:22 +00:00
Jeff Hill
46e00da251 recompute the current time variable after waiting in a semaphore
(instead of select)
1995-08-22 00:24:38 +00:00
Jeff Hill
39d98562fc dont recompute connection timers if the time stamp hasnt changed 1995-08-22 00:23:36 +00:00
Jeff Hill
8624be05d4 Dont wait for itsy bitsy delays to expire 1995-08-22 00:22:52 +00:00
Jeff Hill
c0da182217 Dont recompute connection timers if the time stamp hasnt changed 1995-08-22 00:22:07 +00:00
Jeff Hill
6dab97f8e7 added KLUDGE def of S_db_Pending 1995-08-22 00:20:27 +00:00
Jeff Hill
1abcc71e71 use current time var to init time stamp in a beacon hash entry 1995-08-22 00:19:21 +00:00
Jeff Hill
f8f17eeb33 comments changed 1995-08-22 00:17:11 +00:00
Jeff Hill
db50e1bdd7 Added test of the duration of ca_pend_event() 1995-08-22 00:16:34 +00:00
Jeff Hill
96605d4439 Use 1.0/USEC_PER_SEC and not 1.0e-6
Check for S_db_Pending when calling dbPutNotify()
1995-08-22 00:15:19 +00:00
Jeff Hill
593bc413bf *** empty log message *** 1995-08-22 00:12:07 +00:00
Marty Kraimer
3e20abece8 When initing new card wait yp to 3 seconds to read old values. 1995-08-18 17:59:09 +00:00
Marty Kraimer
79c01170e8 db_post_event had illegal arg for val field 1995-08-18 15:22:28 +00:00
Marty Kraimer
6c21758d23 fixed 2nd arg of db_post_event for clcv 1995-08-18 15:11:35 +00:00
Marty Kraimer
d2347c497c Changes for ansi c 1995-08-18 15:07:32 +00:00
Marty Kraimer
099f63fb20 Made changes for ansi c 1995-08-18 13:19:37 +00:00
Jeff Hill
665a5134d3 send flush message when we see a new client 1995-08-18 00:30:07 +00:00
Jim Kowalkowski
e1b04e69bb fixed all the -pendantic errors (pain) 1995-08-17 20:35:09 +00:00
Janet B. Anderson
8375a2cf18 Moved bldEnvData,blderrSymTbl, makeStatTbl to libCom dir 1995-08-17 20:22:13 +00:00
Janet B. Anderson
300f38584b Added base/tools scripts functionality to base/Makefile, removed scripts
Moved base/tools/MakeRelease to base dir.
1995-08-17 20:15:03 +00:00
Janet B. Anderson
b9a5acc88c Fixed comment that broke during previous commit 1995-08-17 19:49:52 +00:00
Jim Kowalkowski
2ff81c09f0 Completed the accurate time stamp change. event number 0 is current time
updated at 60HZ, event -1 is the best time that can be provided (1000Hz in
the APS event system).  The vxWorks time is now correct (1970 instead of
1900).
1995-08-17 19:43:04 +00:00
Janet B. Anderson
63eefd2ba8 Makefile now uses library build rule from RULES.Vx 1995-08-17 15:43:34 +00:00
Janet B. Anderson
f9f8e55035 Moved cvtBpt.c to db dir so libCom builds without record header dependancies 1995-08-17 15:39:10 +00:00
Janet B. Anderson
0f8f36c4bb Makefile now uses library build rule from RULES.Vx
Moved cvtBpt.c to db dir so libCom builds without record header dependancies
1995-08-17 15:38:03 +00:00
Janet B. Anderson
fd6e666256 Makefile now uses library build rule from RULES.Vx 1995-08-17 15:33:47 +00:00
Janet B. Anderson
d492d665fc Moved cvtBpt.c from libCom so libCom now has no record header dependancies 1995-08-17 15:31:42 +00:00
Janet B. Anderson
6b659e8404 Makefile now uses library build rule from RULES.Vx.
Moved cvtBpt.c from libCom so libCom now has no record header dependancies
1995-08-17 15:31:24 +00:00
Janet B. Anderson
43ecde53f3 Makefile now uses library build rule from RULES.Vx,removed redundant rules. 1995-08-17 15:28:32 +00:00
Janet B. Anderson
e6ffa71c54 Removed redundant rules. 1995-08-17 15:27:11 +00:00
Janet B. Anderson
be6ecdfe24 Makefile now uses library build rule from RULES.Vx 1995-08-17 15:25:45 +00:00
Marty Kraimer
e6bec6af38 mrk committed for dalesio 1995-08-17 14:51:53 +00:00
Marty Kraimer
59a2f10867 Initialize oval properly 1995-08-17 14:50:43 +00:00
Marty Kraimer
00abe6b876 Removed recSwitch 1995-08-17 14:50:17 +00:00
Marty Kraimer
b0e9cc9fba Made changes so that it doesnt call dbCalloc 1995-08-17 14:48:02 +00:00
Marty Kraimer
6eb04984bd Removed epicsSetEnvParams 1995-08-17 14:47:40 +00:00
Marty Kraimer
d9a05d6051 added abConfigScanListAscii and abConfigAuto 1995-08-17 14:45:57 +00:00
Marty Kraimer
d9233e4864 ansi changes 1995-08-17 14:43:49 +00:00
Marty Kraimer
34bd710ffa Removed INITHOOKafterSetEnvParams 1995-08-17 14:42:43 +00:00
Marty Kraimer
438f00a708 Changes to make more ansi compatible 1995-08-17 14:42:12 +00:00
Marty Kraimer
622a225308 Changed hash algorithm to allow larger table sizes 1995-08-17 14:41:05 +00:00
Marty Kraimer
1c14ac4941 post_event and scanOnce no longer give error message storms for ring buffer overflows.
Made changes so that casts are ANSI C compatible
1995-08-17 14:39:46 +00:00
Marty Kraimer
df2ce01069 Made change for new putNotify 1995-08-17 14:36:54 +00:00
Marty Kraimer
f7aa394524 Changed algorithm for computing lock sets.
No longer calls epicsSetEnvParams.
1995-08-17 14:36:29 +00:00
Marty Kraimer
ed6047ec51 Many changes. It should now work in all cases( I hope). 1995-08-17 14:35:47 +00:00
Marty Kraimer
a3573cd384 If record should be processed because of put and record is active and TPRO is true then print active message.
Fixed some casts so that they are ANSI compatible
putStringUshort converts to float first then to ushort
putStringUlong converts to double first then to unsigned long
1995-08-17 14:34:55 +00:00
Marty Kraimer
81deb4fceb Use new hash algorirthm. New variable dbPvdHashTableSize can be set after ld < iocCore 1995-08-17 14:33:55 +00:00
Marty Kraimer
b7378bbc62 Added -Wall -pedantic -ansi 1995-08-17 14:33:18 +00:00
Marty Kraimer
bdffdb0369 If asSetFilename is given NULL argument then next call to asInit turns off access security.
Allow character '-' in pvnames.
1995-08-17 14:31:52 +00:00
Ned Arnold
98809f8141 made QUEUE_SIZE a global variable so users could control mallocing 1995-08-16 20:53:26 +00:00
Jim Kowalkowski
8a0f66cb9b Corrected multiple card bug. 1995-08-16 19:15:07 +00:00
Jim Kowalkowski
0462aed01d Many updates. Added GPS ability and adjusted the printf's. 1995-08-16 19:03:21 +00:00
Jim Kowalkowski
ea279855da Allow for ~ in both pv name and value. 1995-08-16 18:16:43 +00:00
Jeff Hill
66210afed7 epicsAPI => epicsShareAPI 1995-08-14 19:26:15 +00:00
Jeff Hill
c13d342680 fixed compilation error 1995-08-14 16:08:08 +00:00
Jeff Hill
549a4ba978 func proto added 1995-08-12 01:20:36 +00:00
Jeff Hill
cf7fe3deb4 force double alignment of the protocol buffer 1995-08-12 01:18:28 +00:00
Jeff Hill
ef8abaa44f keep trying 1995-08-12 01:17:38 +00:00
Jeff Hill
5624aaefe1 fetch the server's port number 1995-08-12 01:16:26 +00:00
Jeff Hill
2b7e4ff84d dont quit if client unreachable 1995-08-12 01:15:08 +00:00
Jeff Hill
fb2c2f0925 dont reuse res id 1995-08-12 01:14:22 +00:00
Jeff Hill
55dae7db1c no dbg lib 1995-08-12 01:13:30 +00:00
Jeff Hill
524da0d2df doc 1995-08-12 01:12:37 +00:00
Jeff Hill
93c191ffe9 windows NT changes 1995-08-12 01:11:53 +00:00
Jeff Hill
0dc2be41d3 dont allow res id reuse 1995-08-12 01:10:57 +00:00
Jeff Hill
11af4456c7 dont return (and leak memory) 1995-08-12 01:10:25 +00:00
Jeff Hill
f232999d32 dont print if the format is NULL 1995-08-12 01:04:11 +00:00
Jeff Hill
ca13bfdff9 dont call vprintf if pformat is NULL 1995-08-12 01:03:17 +00:00
Jeff Hill
21cbea930a added casdef.h 1995-08-12 01:02:39 +00:00
Jeff Hill
8b06e22907 added return to print func 1995-08-12 01:02:11 +00:00
Jeff Hill
f3dcfd60bb dont allow reallocation of the same res id
use std EPICS status
1995-08-12 01:01:20 +00:00
Jeff Hill
1b33e449c6 use $log in header 1995-08-12 01:00:07 +00:00
Jeff Hill
afa208a5e1 use $log in header 1995-08-12 00:59:11 +00:00
Jeff Hill
5903ff0cdb use arch independent types 1995-08-12 00:48:21 +00:00
Jeff Hill
51d44c6200 use epicsApi 1995-08-12 00:44:13 +00:00
Jeff Hill
a362731044 use const in proto 1995-08-12 00:43:41 +00:00
Jeff Hill
0e225a4335 use epicsEntry 1995-08-12 00:42:23 +00:00
Jeff Hill
8c0527c25a dont allow res id reuse 1995-08-12 00:41:52 +00:00
Jeff Hill
92f91ee2cc allow multiple servers on one machine 1995-08-12 00:40:58 +00:00
Jeff Hill
1bd52dfef9 discover loss of client by connecting UDP sockets 1995-08-12 00:37:28 +00:00
Jeff Hill
c7005b4783 dont muck with signal handlers already installed 1995-08-12 00:31:37 +00:00
Jeff Hill
d9e3f09760 win NT changes 1995-08-12 00:30:24 +00:00
Jeff Hill
07a265d299 added const 1995-08-12 00:29:39 +00:00
Jeff Hill
feb73d85b3 bumbed CA minor version to 5 1995-08-12 00:28:58 +00:00
Jeff Hill
f18238a8b9 added shareLib.h and const to proto 1995-08-12 00:28:10 +00:00
Jeff Hill
8ff5572e6c linux changes 1995-08-12 00:27:24 +00:00
Jeff Hill
865e69d7d3 added const to func proto 1995-08-12 00:26:26 +00:00
Jeff Hill
38f82f342d new ca_pend_event() duration test 1995-08-12 00:25:34 +00:00
Jeff Hill
20fd27263a sped up ca_pend_event() poll 1995-08-12 00:24:58 +00:00
Jeff Hill
7760d16956 better fp test 1995-08-12 00:24:26 +00:00
Jeff Hill
3fab82780b check for res id in use, epicsEntry, dont wait for itsy bitsy delay
in ca_pend_event(), better clean up when monitor is deleted and
we are disconnected
1995-08-12 00:23:32 +00:00
Jeff Hill
fd679234dd doc 1995-08-12 00:18:59 +00:00
Ned Arnold
7f949f441b Corrected bug of not allocating space for .dola : Multiple records with DOLN's did not work. 1995-08-07 15:36:37 +00:00
John Winans
48640936f5 Changed the parameter table and associated support routines to support
buffer length specifications of size long instead of short.
1995-07-31 19:44:18 +00:00
John Winans
1e2d258c66 first release 1995-07-27 14:23:02 +00:00
John Winans
83d4ee2313 Changed the way send() is called to account for structure padding. 1995-05-30 14:45:44 +00:00
Jeff Hill
67324dc7b7 use DBR_STRING parameter instead of just zero 1995-05-23 20:45:08 +00:00
Jim Kowalkowski
47843d49a0 updates to allow direct read of time stamps from event systems 1995-05-22 15:21:39 +00:00
John Winans
d27f70a883 Aded logic to handle the new BdtEof protocol state. 1995-05-16 15:39:27 +00:00
Jim Kowalkowski
bcde03d0a0 new functions to support the bulk data transfer 1995-05-11 02:10:50 +00:00
Andrew Johnson
1887fbd7f8 Added CONFIG_SITE_ENV, changed envData to .c file 1995-05-04 09:49:18 +00:00
Andrew Johnson
f3e0f33d15 Fixed port4_5 / port6_7 swap in bo_driver 1995-05-01 17:16:23 +00:00
cvs2svn
09e1c40650 This commit was manufactured by cvs2svn to create tag 'R3.12.1'. 1995-04-26 14:17:01 +00:00
cvs2svn
0de34c3162 This commit was manufactured by cvs2svn to create tag 'R3.12.0-beta13'. 1995-04-26 14:17:00 +00:00
373 changed files with 47375 additions and 15886 deletions

View File

@@ -0,0 +1,45 @@
/*****************************************************************
COPYRIGHT NOTIFICATION
*****************************************************************
THE FOLLOWING IS A NOTICE OF COPYRIGHT, AVAILABILITY OF THE CODE,
AND DISCLAIMER WHICH MUST BE INCLUDED IN THE PROLOGUE OF THE CODE
AND IN ALL SOURCE LISTINGS OF THE CODE.
(C) COPYRIGHT 1993 UNIVERSITY OF CHICAGO
Argonne National Laboratory (ANL), with facilities in the States of
Illinois and Idaho, is owned by the United States Government, and
operated by the University of Chicago under provision of a contract
with the Department of Energy.
Portions of this material resulted from work developed under a U.S.
Government contract and are subject to the following license: For
a period of five years from March 30, 1993, the Government is
granted for itself and others acting on its behalf a paid-up,
nonexclusive, irrevocable worldwide license in this computer
software to reproduce, prepare derivative works, and perform
publicly and display publicly. With the approval of DOE, this
period may be renewed for two additional five year periods.
Following the expiration of this period or periods, the Government
is granted for itself and others acting on its behalf, a paid-up,
nonexclusive, irrevocable worldwide license in this computer
software to reproduce, prepare derivative works, distribute copies
to the public, perform publicly and display publicly, and to permit
others to do so.
*****************************************************************
DISCLAIMER
*****************************************************************
NEITHER THE UNITED STATES GOVERNMENT NOR ANY AGENCY THEREOF, NOR
THE UNIVERSITY OF CHICAGO, NOR ANY OF THEIR EMPLOYEES OR OFFICERS,
MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR ASSUMES ANY LEGAL
LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS, OR
USEFULNESS OF ANY INFORMATION, APPARATUS, PRODUCT, OR PROCESS
DISCLOSED, OR REPRESENTS THAT ITS USE WOULD NOT INFRINGE PRIVATELY
OWNED RIGHTS.
*****************************************************************
LICENSING INQUIRIES MAY BE DIRECTED TO THE INDUSTRIAL TECHNOLOGY
DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).

140
MakeRelease Executable file
View File

@@ -0,0 +1,140 @@
#!/bin/sh
#
# $Id$
#
# Make Release - Creates an EPICS release
# By Matthew Needes and Bob Zieman
#
# MakeRelease [-b]
#
# [-b] - For fully built release
#
# $Log$
# Revision 1.2 1995/08/28 15:49:54 jba
# Added startup directory to release tar file
#
# Revision 1.1 1995/08/17 20:14:56 jba
# Added base/tools scripts functionality to base/Makefile, removed scripts
# Moved base/tools/MakeRelease to base dir.
#
# Revision 1.14 1994/12/19 18:42:08 tang
# Make the args length compatible for HP and SUN.
#
# Revision 1.13 1994/12/15 19:19:18 tang
# Replace -I opt by cat and xargs for tar for HP compatibility.
#
# Revision 1.12 1994/12/14 23:57:55 tang
# Take out \< and \> pair for hp compatible
#
# Revision 1.11 1994/10/31 21:44:17 jba
# Moved print stmnt, added cd $(EPICS)
#
# Revision 1.10 1994/10/05 18:29:34 jba
# Renamed version.h to epicsVersion.h
#
# Revision 1.9 1994/09/22 01:41:47 mcn
# MakeRelease - MAJOR bug fix. GetVar / MakeDirs - minor fix.
#
# Revision 1.8 1994/09/07 20:59:15 mcn
# Revamped GetVar, modified scripts for new GetVar.
#
# Revision 1.7 1994/09/02 20:58:00 mcn
# minor change.
#
# Revision 1.6 1994/08/21 00:56:41 mcn
# New Stuff
#
# Revision 1.5 1994/08/02 18:36:29 mcn
# Support new configuration.
#
# Revision 1.4 1994/07/14 22:13:32 mcn
# Now include SDR Makefile/Headers
#
#
EPICS=${1};
if [ ! -d include -o ! -d src ]; then
echo "Cannot find src or include, are you at the top of EPICS base ?"
exit 1
fi
cd $EPICS/base
FULLY_BUILT=NO
if [ "${2}" = "-b" ]; then
FULLY_BUILT=YES
shift
fi
# Retrieve EPICS release string from include/epicsVersion.h
grep EPICS_VERSION_STRING include/epicsVersion.h > /dev/null 2>&1 || ERR=1;
if [ "$ERR" = "1" ];
then
echo "TOP: Cannot retrieve release number from include/epicsVersion.h";
exit 1;
fi
RELS=`grep "EPICS_VERSION_STRING" include/epicsVersion.h \
| sed -e 's-.*Version--' \
-e 's-[ ][ ]*--g' \
-e 's-".*--' \
-e 's-\.0$--'`;
if [ -z "${RELS}" ];
then
echo "TOP: Cannot retrieve release number from include/epicsVersion.h";
exit 1;
fi
RELS="R${RELS}";
echo TOP: Creating ../${RELS}.Tar;
if [ -f ${RELS}.Tar* ];
then
echo "TOP: This release has already been created.";
echo "TOP: Remove Tar file or edit include/epicsVersion.h.";
exit 1;
fi
# Create list of files and dirs to include in Tar file
cd $EPICS
ls base/README* | xargs tar cvf ${RELS}.Tar
ls base/Makefile* > /tmp/make_release.out.$$;
ls base/*COPYRIGHT* >> /tmp/make_release.out.$$;
if [ -d startup ];
then
find startup -name CVS -prune -o ! -type d -print \
>> /tmp/make_release.out.$$;
fi
find config base/include base/man base/tools -name CVS -prune -o \
! -type d -print >> /tmp/make_release.out.$$;
# binary / library / default.dctsdr / <rec>Record.h / etc.
if [ $FULLY_BUILT = "YES" ];
then
find base/bin -name CVS -prune -o ! -type d -print \
>> /tmp/make_release.out.$$;
find base/lib -name CVS -prune -o ! -type d -print \
>> /tmp/make_release.out.$$;
find base/rec -name CVS -prune -o ! -type d -print \
>> /tmp/make_release.out.$$;
fi
find base/src -name CVS -prune -o -name SCCS -prune -o ! -type d -print \
| grep -v '/O\..*$' >> /tmp/make_release.out.$$
cat /tmp/make_release.out.$$ | xargs tar rvf ${RELS}.Tar
rm /tmp/make_release.out.$$

View File

@@ -12,6 +12,9 @@
# install because the release.% syntax is illegal.
#
# $Log$
# Revision 1.23 1995/02/13 15:00:09 jba
# Changed include file from CONFIG_SITE to CONFIG
#
# Revision 1.22 1994/11/14 23:12:17 tang
# Replace ARCH_TYPE with .
#
@@ -74,21 +77,27 @@ depends:
${MAKE} ${MFLAGS} $@.$$ARCH; \
done)
clean:
@(for ARCH in ${BUILD_ARCHS}; \
do \
ARCH_TYPE=$$ARCH \
${MAKE} ${MFLAGS} $@.$$ARCH; \
done)
uninstall:
@(for ARCH in ${BUILD_ARCHS}; \
do \
ARCH_TYPE=$$ARCH \
${MAKE} ${MFLAGS} $@.$$ARCH; \
done)
release:
@echo TOP: Creating Release...
@tools/MakeRelease
@./MakeRelease ${EPICS}
built_release: install
@echo TOP: Creating Fully Built Release...
@tools/MakeRelease -b
clean:
@echo "TOP: Cleaning"
@tools/Clean
uninstall:
rm -rf bin/* lib/* rec.bak
rm -f rec/default.dctsdr rec/default.sdrSum rec/*.h
@./MakeRelease ${EPICS} -b
# Notes for single architecture build rules:
# CheckArch only has to be run for dirs.% . That
@@ -107,20 +116,15 @@ uninstall:
# some things may be included on a per architecture
# basis.
dirs.%:
@tools/CheckArch $*
@echo $*: Creating Directories
@tools/MakeDirs $*
build.%: dirs.%
build.%:
@echo $*: Building
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs build
install.%: dirs.%
install.%:
@echo $*: Installing
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs install
depends.%: dirs.%
depends.%:
@echo $*: Performing Make Depends
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs depends
@@ -133,11 +137,10 @@ release.%:
@echo
uninstall.%:
@echo
@echo "The uninstall.arch syntax is not supported by this build."
@echo
@echo "TOP: Uninstalling $* "
@rm -rf ./bin/$* ./lib/$* rec.bak rec
clean.%:
@echo "$*: Cleaning"
@tools/Clean $*
@echo "TOP: Cleaning $* "
@find src -type d -name "O.$*" -prune -exec rm -rf {} \;

View File

@@ -5,6 +5,9 @@
# by Matthew Needes and Mike Bordua
#
# $Log$
# Revision 1.13 1994/09/09 17:32:29 jba
# Cleanup of files
#
# Revision 1.12 1994/09/08 17:25:41 mcn
# Changed clean to tools/Clean. Added "uninstall" dependency.
#
@@ -27,7 +30,7 @@ include $(EPICS)/config/CONFIG_BASE
all: build
build:
build: dirs
@(for DIR in ${DIRS}; \
do \
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
@@ -35,7 +38,7 @@ build:
cd $$TMP; \
done)
install:
install: dirs
@(for DIR in ${DIRS}; \
do \
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
@@ -43,7 +46,7 @@ install:
cd $$TMP; \
done)
depends:
depends: dirs
@(for DIR in ${DIRS}; \
do \
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
@@ -51,3 +54,23 @@ depends:
cd $$TMP; \
done)
dirs:
@echo ${T_A}: Creating Directories
@for DIR in ${DIRS}; \
do \
TMP=`pwd`; \
cd $$DIR ; \
if [ -f Makefile.${BUILD_TYPE} ] ; then \
test -d O.${T_A} || \
mkdir O.${T_A}; \
test -f O.${T_A}/Makefile || \
ln -s ../Makefile.${BUILD_TYPE} O.${T_A}/Makefile \
> /dev/null 2> /dev/null; \
test -f O.${T_A}/Target.include || \
echo "T_A=${T_A}" > O.${T_A}/Target.include; \
test -f O.${T_A}/.DEPENDS || \
touch O.${T_A}/.DEPENDS; \
fi ; \
cd $$TMP; \
done

74
README
View File

@@ -7,23 +7,13 @@ $Id$
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 \
EPICS/extensions/bin HOST_ARCH )
e.g.:
set path = ( $path /home/epics/base/tools /home/epics/base/bin/sun4 \
/home/epics/extensions/bin/sun4 )
1. Before you can build or really use EPICS, you must properly set the
environemnt variable HOST_ARCH. The epics/startup/HostArch script file
has been provided to set HOST_ARCH.
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.
gmake
the build, gnumake. Set your path so that a recent version (e.g.
V3.70) of gnumake is available (as make) before any system supplied makes.
----------------------------------------------------------------------------
Part 1 - Configuring and Building EPICS Base
@@ -39,63 +29,63 @@ gmake
cd epics/config
cp CONFIG_ARCH.mv167 CONFIG_ARCH.YOUR_ARCH
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
cp CONFIG.Vx.68k CONFIG.Vx.YOUR_ARCH_CLASS
cp CONFIG_SITE.Vx.68k CONFIG_SITE.Vx.YOUR_ARCH_CLASS
- ONLY IF you are adding a new architecture class,
see note in Appendix A.
edit CONFIG_BASE - Add architecture to list.
edit CONFIG_BASE - Add architecture to list.
1.3 To build EPICS:
cd epics/base
gmake - To build and install EPICS.
gmake clean - To clean temporary object files. Clean will
gnumake - To build and install EPICS.
gnumake 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 base/include/version.h - ONLY IF you need to change the EPICS
version number.
edit base/include/version.h - ONLY IF you need to change the EPICS
version number.
gmake release - Will create Tar file
gnumake release - Will create Tar file
gmake built_release - Will create Tar file, after generating
dependencies, INCLUDING BINARIES.
gnumake built_release - Will create Tar file, after generating
dependencies, INCLUDING BINARIES.
1.5 "Partial" build commands:
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).
gnumake clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
gnumake install.sun4 - Builds sun4 only.
gnumake install.mv167 - Builds mv167 only (a HOST_ARCH build must
be complete before this can be issued).
NOTES:
1. tools/MakeRelease will create tar files in the directory ABOVE
base. These tar files are then meant to be untarred at that level.
This release will include the "epics/config" directory.
1. base/MakeRelease will create tar files in the directory ABOVE
base. These tar files are then meant to be untarred at that level.
This release will include the "epics/config" directory.
2. EPICS binaries are kept in the bin/ARCH and lib/ARCH directories.
EPICS shellscripts are kept in the tools directory.
EPICS shellscripts are kept in the tools directory.
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 built_release" is performed will dependencies
be generated automatically.
dependency will NOT be invoked. Only if "make depends" is run
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.
While developing source for EPICS, merely cd src/DIR/O.ARCH, and
invoke "make":
for multiple architectures to be maintained at the same time.
While developing source for EPICS, merely cd src/DIR/O.ARCH, and
invoke "make":
cd epics/base/src/db/O.mv167
make dbAccess.o
cd epics/base/src/db/O.mv167
make dbAccess.o
The above example instructs make to build dbAccess.o for the
mv167 target.
The above example instructs make to build dbAccess.o for the
mv167 target.
----------------------------------------------------------------------------
Part 2 --- Configuration Files in epics/config

34
README.Linux Normal file
View File

@@ -0,0 +1,34 @@
Special Notes on Linux
1) The epics makefiles use GNU make which is the make that comes
with Linux. You need to make a link from make to gnumake and
have it in your path. After you have defined the EPICS environement
variable, you can use:
ln -s /usr/bin/make $EPICS/base/tools/gnumake
2) At this point, support for Linux only involves channel access
clients. Since Vxworks is not available for Linux, you must
use other platforms for developing server side code. As for
building databases with dct and gdct, this requires that the
$EPICS/base/tools/makesdr script works properly. Since makesdr
is slated to be removed from the EPICS distribution in a future
release, we didn't feel it was important to include this capability
now. Consequently, when you run make you will receive the error
gnumake[4]: *** [bldDefaultSdr] Error 127
and
gnumake[3]: *** [comsubs.o] Error 1
3) You MUST start caRepeater by hand before running a client.
Prior to running a client, you must run:
caRepeater &
---
jpq@nwu.edu

View File

@@ -4,42 +4,11 @@
# M. Anderson and J. Tang
- EPICS environment variable - set by hand prior to build
For EPICS builds on HP700 and Alpha OSF/1, set an environment variable "EPICS"
to the base of the EPICS directory to do builds in (the directory where
this file resides, for instance).
If you are currently in the base directory, then do the following:
% setenv EPICS $cwd
- set path to include gnu make and base/tools and base/bin/<arch>
Then set the path such that a recent version (e.g. V3.70) of gnumake
is available (as make) before any system supplied makes, and that
$EPICS/base/tools and $EPICS/base/bin/<arch> are included as well.
For example:
% set path=(/usr/local/bin $EPICS/base/tools $EPICS/base/bin/hp700 $path)
- to build multiple architectures in same tree
To build multiple architectures in the same directory tree, you
can avoid editing CONFIG_SITE by simply issuing make with HOST_ARCH=<arch>
For example:
% make HOST_ARCH=hp700
Also, directory permissions may not be correct across multiple machines,
so a
- Directory permissions may not be correct across multiple machines, so a
% chmod -R ugo+rw base extensions
might be necessary.
- bsdinstall is written to replace install for hp.
- epics/base/tools/bsdinstall was written to replace install for hp.

View File

@@ -1,29 +1,21 @@
----------------------------------------------------------------------------
EPICS R3.12 Notes for Solaris 2.3
EPICS R3.12.2 Notes for Solaris
- 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.
1. In order to build EPICS under Solaris 2, you must ensure that the
solaris directory /usr/ccs/bin is in your search path.
setenv PATH /usr/ucb:/usr/bin:/usr/ccs/bin:$PATH
2. It is not possible to compile EPICS under Solaris 2 using only the
GNU gcc compiler -- you must have the Sun SPARCworks ANSI C compiler.
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.
3. EPICS under Solaris 2 no longer uses the UCB compatability
libraries. It does require the /usr/ucb/install program however. In
order to ensure that the /usr/ucblib files are not inherited, you
should ensure that your LD_LIBRARY_PATH environment variable does not
include /usr/ucblib when you build any of the host tools.
--
anj@mail.ast.cam.ac.uk
anj@ast.cam.ac.uk

View File

@@ -0,0 +1,10 @@
/*****************************************************************
COPYRIGHT NOTIFICATION
*****************************************************************
(C) COPYRIGHT 1993 UNIVERSITY OF CHICAGO
This software was developed under a United States Government license
described on the COPYRIGHT_UniversityOfChicago file included as part
of this distribution.
**********************************************************************/

View File

@@ -11,9 +11,6 @@ DEPLIBS = ./libAs.a\
$(DEPLIBS_BASE)/libCom.a\
$(DEPLIBS_BASE)/libDb.a
LEX = $(ELEX)
YACC = $(EYACC)
SRCS.c = ../ascheck.c asLib.c
OBJS = ascheck.o
LIBOBJS = asLib.o

View File

@@ -5,8 +5,8 @@ include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
SRCS.c = ../asDbLib.c ../asCa.c asLib.c
OBJS = asDbLib.o asCa.o asLib.o
PROD = asLibrary
LIBOBJS = asDbLib.o asCa.o asLib.o
LIBNAME = asLibrary
include $(EPICS)/config/RULES.Vx
@@ -18,7 +18,4 @@ asLib.o: asLib_lex.c ../asLibRoutines.c
clean::
@$(RM) asLib_lex.c asLib.c
asLibrary : $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)

View File

@@ -58,9 +58,13 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <dbDefs.h>
#include <taskwd.h>
#include <alarm.h>
#include <caeventmask.h>
#include <dbStaticLib.h>
#include <dbAccess.h>
#include <asLib.h>
#include <asDbLib.h>
#include <dbCommon.h>
@@ -68,7 +72,7 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
#include <subRecord.h>
#include <task_params.h>
extern struct dbBase *pdbBase;
extern struct dbBase *pdbbase;
static FILE *stream;
#define BUF_SIZE 100
@@ -97,12 +101,12 @@ static int my_yyinput(char *buf, int max_size)
static long asDbAddRecords(void)
{
DBENTRY dbentry;
DBENTRY *pdbentry=&dbentry;
long status;
struct dbCommon *precord;
DBENTRY dbentry;
DBENTRY *pdbentry=&dbentry;
long status;
dbCommon *precord;
dbInitEntry(pdbBase,pdbentry);
dbInitEntry(pdbbase,pdbentry);
status = dbFirstRecdes(pdbentry);
while(!status) {
status = dbFirstRecord(pdbentry);
@@ -148,13 +152,16 @@ static long asInitCommon(void)
long status;
char buffer[BUF_SIZE];
if(!pacf) return(0);
if(asLockInit) {
FASTLOCKINIT(&asLock);
asLockInit = FALSE;
}
FASTLOCK(&asLock);
if(asActive)asCaStop();
if(!pacf) {
asActive = FALSE;
return(0);
}
buffer[0] = 0;
my_buffer = buffer;
my_buffer_ptr = my_buffer;
@@ -232,7 +239,7 @@ int asInitAsyn(ASDBCALLBACK *pcallback)
static void myCallback(CALLBACK *pcallback)
{
ASDBCALLBACK *pasdbcallback = (ASDBCALLBACK *)pcallback;
struct subRecord *precord;
subRecord *precord;
struct rset *prset;
callbackGetUser(precord,pcallback);
@@ -242,12 +249,12 @@ static void myCallback(CALLBACK *pcallback)
recGblSetSevr(precord,READ_ALARM,precord->brsv);
recGblRecordError(pasdbcallback->status,precord,"asInit Failed");
}
dbScanLock((struct dbCommon *)precord);
(*prset->process)((struct dbCommon *)precord);
dbScanUnlock((struct dbCommon *)precord);
dbScanLock((dbCommon *)precord);
(*prset->process)((dbCommon *)precord);
dbScanUnlock((dbCommon *)precord);
}
long asSubInit(struct subRecord *precord,int pass)
long asSubInit(subRecord *precord,int pass)
{
ASDBCALLBACK *pcallback;
@@ -258,7 +265,7 @@ long asSubInit(struct subRecord *precord,int pass)
return(0);
}
long asSubProcess(struct subRecord *precord)
long asSubProcess(subRecord *precord)
{
ASDBCALLBACK *pcallback = (ASDBCALLBACK *)precord->dpvt;
@@ -275,8 +282,8 @@ long asSubProcess(struct subRecord *precord)
int asDbGetAsl(void *paddress)
{
struct dbAddr *paddr = paddress;
struct fldDes *pflddes;
DBADDR *paddr = paddress;
dbFldDes *pflddes;
pflddes = paddr->pfldDes;
return((int)pflddes->as_level);
@@ -284,8 +291,8 @@ int asDbGetAsl(void *paddress)
ASMEMBERPVT asDbGetMemberPvt(void *paddress)
{
struct dbAddr *paddr = paddress;
struct dbCommon *precord;
DBADDR *paddr = paddress;
dbCommon *precord;
precord = paddr->precord;
return((ASMEMBERPVT)precord->asp);
@@ -300,13 +307,13 @@ static void astacCallback(ASCLIENTPVT clientPvt,asClientStatus status)
int astac(char *pname,char *user,char *location)
{
struct dbAddr *paddr;
long status;
ASCLIENTPVT *pasclientpvt=NULL;
struct dbCommon *precord;
struct fldDes *pflddes;
DBADDR *paddr;
long status;
ASCLIENTPVT *pasclientpvt=NULL;
dbCommon *precord;
dbFldDes *pflddes;
paddr = dbCalloc(1,sizeof(struct dbAddr) + sizeof(ASCLIENTPVT));
paddr = dbCalloc(1,sizeof(DBADDR) + sizeof(ASCLIENTPVT));
pasclientpvt = (ASCLIENTPVT *)(paddr + 1);
status=dbNameToAddr(pname,paddr);
if(status) {
@@ -328,7 +335,7 @@ int astac(char *pname,char *user,char *location)
static void myMemberCallback(ASMEMBERPVT memPvt)
{
struct dbCommon *precord;
dbCommon *precord;
precord = asGetMemberPvt(memPvt);
if(precord) printf(" Record:%s",precord->name);

View File

@@ -123,7 +123,7 @@ long asInitialize(ASINPUTFUNCPTR inputfunction)
pasg->pavalue = asCalloc(ASMAXINP,sizeof(double));
pasg = (ASG *)ellNext((ELLNODE *)pasg);
}
gphInitPvt(&pasbase->phash);
gphInitPvt(&pasbase->phash,256);
/*Hash each uagname and each hagname*/
puag = (UAG *)ellFirst(&pasbase->uagList);
while(puag) {

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_\,\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$]
%{

18
src/bdt/Makefile Normal file
View File

@@ -0,0 +1,18 @@
#
# $Id$
#
# Base Lowest Level Directroy Makefile
# by Janet Anderson
#
# $Log$
# Revision 1.1 1994/09/07 19:26:22 jba
# New file
#
#
EPICS=../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS

10
src/bdt/Makefile.Unix Normal file
View File

@@ -0,0 +1,10 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
LIBOBJS += bdt.o
LIBNAME = libBdt.a
include $(EPICS)/config/RULES.Unix

21
src/bdt/Makefile.Vx Normal file
View File

@@ -0,0 +1,21 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
SRCS.c += ../bdt.c
SRCS.c += ../bdtServ.c
SRCS.c += ../bdtServName.c
SRCS.c += ../bdtServPv.c
OBJS += bdt.o
OBJS += bdtServ.o
OBJS += bdtServName.o
OBJS += bdtServPv.o
PROD = bdt
include $(EPICS)/config/RULES.Vx
$(PROD): $(OBJS)
$(RM) $@
$(LINK.c) $@ $(OBJS) $(LDLIBS)

701
src/bdt/bdt.c Normal file
View File

@@ -0,0 +1,701 @@
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <sys/wait.h>
#ifdef linux
#include <sys/resource.h>
#endif
#include <sys/types.h>
#include <sys/socket.h>
#ifdef vxWorks
#include <vxWorks.h>
#include <in.h>
#include <inetLib.h>
#include <taskLib.h>
#include <ioLib.h>
#include <selectLib.h>
#else
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#endif
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include "bdt.h"
/* ---------------------------------------------------------------------- */
/* server mode functions */
#ifndef vxWorks /* server mode functions */
static char* filename=(char*)NULL;
/* ----------------------------- */
/* signal catcher for the server */
/* ----------------------------- */
static void catch_sig(int sig)
{
fprintf(stderr,"\nbdt server exiting\n");
unlink(filename);
exit(0);
}
/* -------------------------------- */
/* child reaper for the server mode */
/* -------------------------------- */
static void get_child(int sig)
{
while(wait3((int *)NULL,WNOHANG,(struct rusage *)NULL)>0);
#ifdef linux
signal(SIGCHLD,get_child); /* for reaping children */
#endif
}
/* ------------------------------- */
/* Clear the signals for a process */
/* ------------------------------- */
int BdtServerClearSignals()
{
signal(SIGCHLD,SIG_DFL);
signal(SIGHUP,SIG_DFL);
signal(SIGINT,SIG_DFL);
signal(SIGTERM,SIG_DFL);
signal(SIGQUIT,SIG_DFL);
return 0;
}
/* ----------------------------------------------------- */
/* Make a unix process into a generic background process */
/* ----------------------------------------------------- */
int BdtMakeServer(char** argv)
{
FILE* fd;
if(filename) return -1;
/* set up signal handling for the server */
signal(SIGCHLD,get_child); /* for reaping children */
signal(SIGHUP,catch_sig);
signal(SIGINT,catch_sig);
signal(SIGTERM,catch_sig);
signal(SIGQUIT,catch_sig);
/* disconnect from parent */
switch(fork())
{
case -1: /* error */
perror("Cannot fork");
return -1;
case 0: /* child */
#ifdef linux
setpgrp();
#else
setpgrp(0,0);
#endif
setsid();
break;
default: /* parent goes away */
exit(0);
}
/* save process ID */
filename=(char*)malloc(strlen(argv[0])+10);
sprintf(filename,"%s.%d",argv[0],getpid());
fd=fopen(filename,"w");
fprintf(fd,"%d",getpid());
fprintf(stderr,"\npv server pid: %d\n",getpid());
fclose(fd);
return 0;
}
#endif /* server mode functions */
/* ------------------------------------------ */
/* unimplemented channel access open function */
/* ------------------------------------------ */
BDT* BdtPvOpen(char *IocName, char* PvName)
{
BDT *bdt;
if((bdt = BdtIpOpen(IocName, BDT_TCP_PORT)) == NULL)
{
fprintf(stderr,"open of address %s failed\n", IocName);
return(NULL);
}
if(BdtServiceConnect(bdt, BDT_SERVICE_PV, PvName) < 0)
{
fprintf(stderr,"connect to PV %s failed\n", PvName);
BdtClose(bdt);
return(NULL);
}
return(bdt);
}
/* --------------------------------------------------------------- */
/* open a bulk data socket to a server given the server IP address */
/* --------------------------------------------------------------- */
BDT* BdtIpOpen(char* address, int Port)
{
struct hostent *pHostent;
struct sockaddr_in tsin;
unsigned long addr;
int osoc;
BDT *bdt;
#ifndef vxWorks
/* Deal with the name -vs- IP number issue. */
if (isdigit(address[0]))
#endif
addr=inet_addr(address);
#ifndef vxWorks
else
{
if ((pHostent = gethostbyname (address)) == NULL)
return(NULL);
bcopy (pHostent->h_addr, (char *) &addr, sizeof(addr));
printf("Converting name >%s< to IP number %08.8X\n", address, addr);
}
#endif
tsin.sin_port=0;
tsin.sin_family=AF_INET;
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
if((osoc=socket(AF_INET,SOCK_STREAM,BDT_TCP))<0)
{
perror("BdtIpOpen: create socket failed");
return (BDT*)NULL;
}
if((bind(osoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
{
perror("BdtIpOpen: local address bind failed");
return (BDT*)NULL;
}
tsin.sin_port=htons(Port);
memcpy((char*)&tsin.sin_addr,(char*)&addr,sizeof(addr));
if(connect(osoc,(struct sockaddr*)&tsin,sizeof(tsin))<0)
{
perror("BdtIpOpen: connect failed");
close(osoc);
return (BDT*)NULL;
}
bdt=(BDT*)malloc(sizeof(BDT));
bdt->soc=osoc;
bdt->remaining_send=0;
bdt->remaining_recv=0;
bdt->state=BdtUnbound;
#ifndef vxWorks
{
int j;
j = fcntl(bdt->soc, F_GETFL, 0);
fcntl(bdt->soc, F_SETFL, j|O_NDELAY);
}
#endif
/* now connected to the bulk data socket on the IOC */
return bdt;
}
/* -------------------------------------- */
/* write size bytes from buffer to socket */
/* -------------------------------------- */
int BdtWrite(int soc,void* buffer,int size)
{
int rc;
int total;
unsigned char* data;
fd_set fds;
struct timeval to;
data=(unsigned char*)buffer;
total=size;
to.tv_sec = 5;
to.tv_usec = 0;
do
{
FD_ZERO(&fds);
FD_SET(soc, &fds);
if (select(soc+1, NULL, &fds, NULL, &to) != 1)
{
printf("BdtWrite: timeout waiting to write data\n");
return(-1);
}
/* send block of data */
if((rc=send(soc,&data[size-total],total,0))<0)
{
if(errno == EINTR)
rc = 0;
else
perror("BdtWrite: Send to remote failed");
}
else
total-=rc;
}
while(rc>0 && total>0);
return (rc<=0)?-1:0;
}
/* --------------------------------------- */
/* send a message header down a BDT socket */
/* --------------------------------------- */
int BdtSendHeader(BDT* bdt,unsigned short verb,int size)
{
BdtMsgHead buf;
if(bdt->state!=BdtIdle)
{
fprintf(stderr,"BdtSendHeader: Interface not idle\n");
bdt->state=BdtBad;
return -1;
}
buf.verb=htons(verb);
buf.size=htonl((unsigned long)size);
if(BdtWrite(bdt->soc,&buf.verb, sizeof(buf.verb))<0)
{
fprintf(stderr,"BdtSendHeader: write to remote failed");
return -1;
}
if(BdtWrite(bdt->soc,&buf.size, sizeof(buf.size))<0)
{
fprintf(stderr,"BdtSendHeader: write to remote failed");
return -1;
}
/* don't wait for response if data must go out */
if(size)
{
bdt->remaining_send=size;
bdt->state=BdtSData;
}
return 0;
}
/* ------------------------------------------- */
/* send a message data chunk down a BDT socket */
/* ------------------------------------------- */
int BdtSendData(BDT* bdt,void* buffer,int size)
{
int len;
int remaining;
int rc;
if(bdt->state!=BdtSData)
{
fprintf(stderr,"BdtSendData: Interface not in send data mode\n");
bdt->state=BdtBad;
return -1;
}
remaining=bdt->remaining_send-size;
if(remaining<0)
{
fprintf(stderr,"WARNING -- BdtSendData: To much data to send\n");
len=bdt->remaining_send;
}
else
len=size;
if (BdtWrite(bdt->soc, buffer, len) < 0)
return -1;
bdt->remaining_send-=len;
if(bdt->remaining_send<0)
{
fprintf(stderr,"BdtSendData: To much data Sent\n");
bdt->remaining_send=0;
}
if(bdt->remaining_send==0)
bdt->state=BdtIdle;
return len;
}
int BdtFlushOutput(BDT* bdt)
{
#ifdef vxWorks
ioctl(bdt->soc, FIOWFLUSH, 0);
#endif
}
/* ------------------------------------- */
/* Read exactly size bytes from remote */
/* ------------------------------------- */
int BdtRead(int soc,void* buffer,int size)
{
int rc,total;
unsigned char* data;
fd_set fds;
struct timeval to;
to.tv_sec = 5;
to.tv_usec = 0;
data=(unsigned char*)buffer;
total=size;
do
{
#if 1
/* wait for data chunk */
FD_ZERO(&fds);
FD_SET(soc, &fds);
if (select(soc+1, &fds, NULL, NULL, &to) != 1)
{
printf("BdtRead: timeout waiting for data\n");
return(-1);
}
#endif
if((rc=recv(soc,&data[size-total],total,0))<0)
{
if(errno==EINTR)
{
printf("BdtRead: EINTR");
rc=0;
}
else
{
perror("BdtRead: Receive data chunk failed");
}
}
else
total-=rc;
}
while(rc>0 && total>0);
return (rc<=0)?-1:0;
}
/* ------------------------------------- */
/* wait for a message header from remote */
/* ------------------------------------- */
int BdtReceiveHeader(BDT* bdt,int* verb,int* size)
{
BdtMsgHead buf;
/* can only receive header when in the idle state */
if (bdt->state == BdtEof)
return -1;
if(bdt->state != BdtIdle)
{
fprintf(stderr,"BdtReceiveHeader: Interface not idle\n");
bdt->state=BdtBad;
return -1;
}
if(BdtRead(bdt->soc,&buf.verb,sizeof(buf.verb))<0)
{
fprintf(stderr,"BdtReceiveHeader: Read failed\n");
return -1;
}
if(BdtRead(bdt->soc,&buf.size,sizeof(buf.size))<0)
{
fprintf(stderr,"BdtReceiveHeader: Read failed\n");
return -1;
}
/* copy message data to user */
*verb=ntohs(buf.verb);
*size=ntohl(buf.size);
if(*size)
bdt->state=BdtRData;
bdt->remaining_recv=*size;
return 0;
}
/* ------------------------------------------------------------------------
Wait for a chunk of data from remote.
User can continually call this with a maximum size until it return 0.
------------------------------------------------------------------------ */
int BdtReceiveData(BDT* bdt,void* buffer,int size)
{
int rc;
/* can only receive data when in the receive data state */
switch(bdt->state)
{
case BdtRData: break;
case BdtIdle: return 0;
default:
fprintf(stderr,"BdtReceiveData: bad receive state\n");
bdt->state=BdtBad;
break;
}
if (bdt->remaining_recv < size)
size = bdt->remaining_recv;
if(BdtRead(bdt->soc,buffer,size)<0)
{
fprintf(stderr,"BdtReceiveData: Read failed\n");
bdt->state = BdtEof;
return -1;
}
bdt->remaining_recv-=size;
if(bdt->remaining_recv<0)
{
fprintf(stderr,"BdtReceiveData: To much data received\n");
bdt->remaining_recv=0;
}
if(bdt->remaining_recv==0)
bdt->state=BdtIdle;
return size;
}
/* ------------------------------------------------------ */
/* connect to a process variable, useful if raw open used */
/* ------------------------------------------------------ */
int BdtServiceConnect(BDT* bdt, char* Name, char *Args)
{
int len;
int rc;
int size;
int verb;
unsigned char NameLen;
unsigned char ArgLen;
if(bdt->state!=BdtUnbound)
{
fprintf(stderr,"BdtServiceConnect: can only bind to one service\n");
return -1;
}
bdt->state=BdtIdle;
NameLen = strlen(Name)+1;
if (Args != NULL)
ArgLen = strlen(Args)+1;
else
ArgLen = 0;
/* send out connect message */
if(BdtSendHeader(bdt, BDT_Connect, NameLen+ArgLen) < 0)
{
fprintf(stderr,"BdtServiceConnect: send of connect header failed\n");
bdt->state=BdtUnbound;
return -1;
}
NameLen--;
ArgLen--;
/* send out the process variable to connect to */
if((BdtSendData(bdt, &NameLen, 1) < 0) || (BdtSendData(bdt, Name, NameLen) < 0))
{
fprintf(stderr,"BdtServiceConnect: send of connect body failed\n");
bdt->state=BdtUnbound;
return -1;
}
if (ArgLen > 0)
{
if ((BdtSendData(bdt, &ArgLen, 1) < 0) || (BdtSendData(bdt, Args, ArgLen) < 0))
{
fprintf(stderr,"BdtServiceConnect: send of connect body failed\n");
bdt->state=BdtUnbound;
return -1;
}
}
rc=0;
/* wait for response from connect to process variable */
if(BdtReceiveHeader(bdt,&verb,&size)<0)
{
fprintf(stderr,"BdtServiceConnect: receive reponse failed\n");
bdt->state=BdtUnbound;
return -1;
}
/* check response */
switch(verb)
{
case BDT_Ok:
rc=0;
break;
case BDT_Error:
fprintf(stderr,"BdtServiceConnect: connection rejected\n");
bdt->state=BdtUnbound;
rc=-1;
break;
default:
fprintf(stderr,"BdtServiceConnect: unknown response from remote\n");
bdt->state=BdtUnbound;
rc=-1;
break;
}
return rc;
}
/* -------------------- */
/* close the connection */
/* -------------------- */
int BdtClose(BDT* bdt)
{
int verb,size,done;
/* send a close message out */
if(BdtSendHeader(bdt,BDT_Close,0)<0)
{
fprintf(stderr,"BdtClose: Cannot send close message\n");
return -1;
}
done=0;
do
{
/* check response */
if(BdtReceiveHeader(bdt,&verb,&size)<0)
{
fprintf(stderr,"BdtClose: Close message response error\n");
return -1;
}
switch(verb)
{
case BDT_Ok:
done=1;
break;
case BDT_Error:
fprintf(stderr,"BdtClose: Close rejected\n");
return -1;
break;
default: break;
}
}
while(done==0);
bdt->state=BdtUnbound;
free(bdt);
return 0;
}
/* --------------------------------------- */
/* make a listener socket for UDP - simple */
/* --------------------------------------- */
int BdtOpenListenerUDP(int Port)
{
int nsoc;
struct sockaddr_in tsin;
tsin.sin_port=htons(Port);
tsin.sin_family=AF_INET;
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
if((nsoc=socket(AF_INET,SOCK_DGRAM,BDT_UDP))<0)
{
perror("BdtOpenListenerUDP: open socket failed");
return -1;
}
if((bind(nsoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
{
perror("BdtOpenListenerUDP: local bind failed");
close(nsoc);
return -1;
}
return nsoc;
}
/* --------------------------------------- */
/* make a listener socket for TCP - simple */
/* --------------------------------------- */
int BdtOpenListenerTCP(int Port)
{
int nsoc;
struct sockaddr_in tsin;
memset (&tsin, 0, sizeof(struct sockaddr_in));
tsin.sin_port=htons(Port);
tsin.sin_family=htons(AF_INET);
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
if((nsoc=socket(AF_INET,SOCK_STREAM,BDT_TCP))<0)
{
perror("BdtOpenListenerTCP: open socket failed");
return -1;
}
if((bind(nsoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
{
perror("BdtOpenListenerTCP: local bind failed");
close(nsoc);
return -1;
}
listen(nsoc,5);
return nsoc;
}
/* ------------------------------- */
/* make BDT from a socket - simple */
/* ------------------------------- */
BDT* BdtMakeBDT(int soc)
{
BDT* bdt;
bdt=(BDT*)malloc(sizeof(BDT));
bdt->soc=soc;
bdt->remaining_send=0;
bdt->remaining_recv=0;
bdt->state=BdtIdle;
return bdt;
}
/* --------------------------- */
/* free a BDT and close socket */
/* --------------------------- */
int BdtFreeBDT(BDT* bdt)
{
close(bdt->soc);
free(bdt);
return 0;
}
int BdtPvPutArray(BDT *bdt, short DbrType, void *Buf, unsigned long NumElements,
unsigned long ElementSize)
{
int Verb;
int Size;
unsigned long BufSize;
BufSize = NumElements * ElementSize;
if (BdtSendHeader(bdt, BDT_Put, 6 + BufSize) != 0)
return(-1);
if (BdtSendData(bdt, &DbrType, 2) < 0)
return(-1);
if (BdtSendData(bdt, &NumElements, 4) < 0)
return(-1);
if (BdtSendData(bdt, Buf, BufSize) < 0)
return(-1);
if (BdtReceiveHeader(bdt, &Verb, &Size) != 0)
return(-1);
if (Verb != BDT_Ok)
return(-1);
return(0);
}

392
src/bdt/bdtServ.c Normal file
View File

@@ -0,0 +1,392 @@
/*
*
* Author: John Winans
* Date: 95-05-22
*
* $Log$
*/
/*****************************************************************************
*
* IOC listener task blocks on accept calls waiting for binders.
* If a bind arrives, a receiver task is spawned.
*
* IOC receiver task blocks on read calls waiting for transactions.
* When a transaction arrives it is serviced.
* At the end of a transaction service, a response is sent back.
* After the response is sent, a chack is made to see if a delta transmission
* was blocked by the transaction's use of the socket... if so, it is sent.
*
******************************************************************************/
#include <selectLib.h>
#include <stdio.h>
#include <signal.h>
#include <vxWorks.h>
#include <sys/socket.h>
#include <in.h>
#include <inetLib.h>
#include <taskLib.h>
#include <sysSymTbl.h>
#include <string.h>
#include "bdt.h"
#define BDT_TASK_PRIO 200
#define BDT_TASK_OPTIONS VX_FP_TASK
#define BDT_TASK_STACK 5000
#define STATIC static
/* used for debugging */
STATIC char *BdtNames[] = {
"BDT_Ok",
"BDT_Connect",
"BDT_Error",
"BDT_Get",
"BDT_Put",
"BDT_Close",
"BDT_Monitor",
"BDT_Value",
"BDT_Delta",
"BDT_Add",
"BDT_Delete",
"BDT_Ping"
};
STATIC int HexDump(char *ReadBuffer, int rbytes);
/*****************************************************************************
*
* A debugging routine that hex-dumps a message to the console.
*
*****************************************************************************/
void BDT_DumpMessage(BDT *Bdt)
{
char Buf[16*4];
int RecvLen;
while(Bdt->remaining_recv)
{
RecvLen = (Bdt->remaining_recv > sizeof(Buf)) ? sizeof(Buf): Bdt->remaining_recv;
if (BdtReceiveData(Bdt, Buf, RecvLen) != RecvLen)
return; /* Got EOF, (EOM handled by the while() */
HexDump(Buf, RecvLen);
}
}
/*****************************************************************************
*
* Throw away a message.
*
****************************************************************************/
void BDT_DiscardMessage(BDT *Bdt)
{
char Buf[16*4];
int RecvLen;
while(Bdt->remaining_recv)
{
RecvLen = (Bdt->remaining_recv > sizeof(Buf)) ? sizeof(Buf): Bdt->remaining_recv;
if (BdtReceiveData(Bdt, Buf, RecvLen) != RecvLen)
return; /* Got EOF, (EOM handled by the while() */
}
}
/*****************************************************************************
*
* Process a single Connect message. And return a response.
*
******************************************************************************/
STATIC int BDT_ProcessConnect(BDT *Bdt)
{
SYM_TYPE Type;
unsigned char length;
char Buf[50];
char HandlerName[70];
if (Bdt->remaining_recv > sizeof(Buf))
{
printf("BDT_ProcessConnect Connect Message too long %d\n", Bdt->remaining_recv);
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
if (Bdt->remaining_recv < 2)
{
printf("BDT_ProcessConnect Connect Message w/missing service name\n");
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
BdtReceiveData(Bdt, &length, 1);
if (length > sizeof(Buf))
{
printf("BDT_ProcessConnect Connect Message service name too long %d\n", length);
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
BdtReceiveData(Bdt, Buf, length);
Buf[length] = '\0';
sprintf(HandlerName, "_BDT_ServiceHandler_%s", Buf);
printf("BDT_ProcessConnect NAME service (%s)\n", HandlerName);
/*Bdt->pHandlers = (BdthandlerFunc *)(&BDT_NameServicehandlers);*/
if (symFindByName(sysSymTbl, HandlerName, (char **)&(Bdt->pHandlers), &Type) != OK)
{
printf("BDT_ProcessConnect Connect to unknown service (%s)\n", Buf);
BdtSendHeader(Bdt, BDT_Error, 0);
}
else
{
Bdt->Name = (char *)malloc(strlen(Buf)+1);
strcpy(Bdt->Name, Buf);
if (Bdt->pHandlers[BDT_Connect] != NULL)
return((*(Bdt->pHandlers[BDT_Connect]))(Bdt));
else
{
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Ok, 0);
}
}
return(0);
}
/*****************************************************************************
*
* Process a single message. And return a response.
*
******************************************************************************/
STATIC int BDT_ProcMessage(BDT *Bdt, unsigned short Command)
{
int RecvLen;
if (Command > BDT_LAST_VERB)
{
printf("BDT: %s Invalid command %d, length = %d\n", Bdt->Name, Command, Bdt->remaining_recv);
BDT_DumpMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
if (Bdt->pHandlers == NULL)
{
if (Command == BDT_Connect)
BDT_ProcessConnect(Bdt);
else
{
printf("BDT_ProcMessage: %s got %s before connect\n", Bdt->Name, BdtNames[Command]);
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
}
return(0);
}
if (Bdt->pHandlers[Command] == NULL)
{
printf("BDT_ProcMessage: service %s got %s... invalid\n", Bdt->Name, BdtNames[Command]);
}
return((*(Bdt->pHandlers[Command]))(Bdt));
}
/*****************************************************************************
*
* Wait on a socket read for a message. When one arrives, read the header,
* decode it, and call the message handler routine to process and respond to it.
*
******************************************************************************/
STATIC void BDT_ReceiverTask(int Sock)
{
int Verb;
int Size;
BDT Bdt;
int MonitorLockTimeout = (BDT_PING_INTERVAL*sysClkRateGet())/2;
static char *NoBdtName = "(No Name)";
fd_set FdSet;
struct timeval TimeVal;
int PollStatus;
int SocketState;
Bdt.soc = Sock;
Bdt.pMonitor = NULL;
Bdt.WriteLock = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
Bdt.MonitorLock = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
Bdt.state = BdtIdle;
Bdt.pHandlers = NULL;
Bdt.Name = NoBdtName;
printf("BDT_ReceiverTask(%d) started\n", Sock);
TimeVal.tv_sec = BDT_CONENCTION_TIMEOUT;
TimeVal.tv_usec = 0;
FD_ZERO(&FdSet);
FD_SET(Bdt.soc, &FdSet);
SocketState = 0;
while (((PollStatus = select(FD_SETSIZE, &FdSet, NULL, NULL, &TimeVal)) > 0) && (BdtReceiveHeader(&Bdt, &Verb, &Size) == 0))
{
semTake(Bdt.WriteLock, WAIT_FOREVER);
SocketState = BDT_ProcMessage(&Bdt, Verb);
if (SocketState != 0)
break;
#if 0
if (semTake(Bdt.MonitorLock, MonitorLockTimeout) == OK)
{
/* Check for delta flag and send if so */
/* Change this to run thru a delta-message linked list */
if (Bdt.pMonitor != NULL)
{
/* Send delta notifier */
}
semGive(Bdt.WriteLock); /* Order important for BDT_SendDelta */
semGive(Bdt.MonitorLock);
}
else
{
printf("BDT_ReceiverTask timeout on monitor semaphore. Monitors are stuck!\n");
semGive(Bdt.WriteLock);
}
#else
semGive(Bdt.WriteLock);
#endif
BdtFlushOutput(&Bdt);
FD_ZERO(&FdSet);
FD_SET(Bdt.soc, &FdSet);
}
if (SocketState == 0)
{
if (PollStatus == 0)
printf("BDT_ReceiverTask(%d) exiting on client timeout\n", Sock);
else
printf("BDT_ReceiverTask(%d) exiting on I/O error talking to Client\n", Sock);
}
else
printf("BDT_ReceiverTask(%d) received close from client\n", Sock);
/* Free up resources */
if (Bdt.Name != NoBdtName)
free(Bdt.Name);
close(Sock);
semDelete(Bdt.WriteLock);
semDelete(Bdt.MonitorLock);
return;
}
/*****************************************************************************
*
******************************************************************************/
#if 0
int BDT_SendDelta(int Socket, char *Message)
{
semTake (DeltaFlagLock, WAIT_FOREVER);
if (if (semTake(SocketWriteLock, no wait) == failed)
{
/* Reader task is busy... Post message for future transmission */
Bdt.pending_delta = 1;
}
else
{
write(Message); /* This COULD block */
semGive(SocketWriteLock);
}
semGive(DeltaFlagLock);
return (0);
}
#endif
/*****************************************************************************
*
* This task listens on a port for new connections. When one is made, it
* spawns a task to manage it.
*
******************************************************************************/
void BDT_ListenerTask(int Port)
{
/* Open a socket to listen on */
struct sockaddr_in ListenerAddr;
struct sockaddr_in ClientAddr;
int ListenerSock;
int ClientSock;
int ClientAddrLen;
int SockAddrSize = sizeof(struct sockaddr_in);
if (Port == 0)
Port = BDT_TCP_PORT;
printf("BDT_Listener(%d) started\n", Port);
if ((ListenerSock = BdtOpenListenerTCP(Port)) < 0)
{
printf("BDT_ListenerTask(%d) can't start listener\n", Port);
return;
}
while (1)
{
ClientAddrLen = sizeof(ClientAddr);
if((ClientSock = accept(ListenerSock, (struct sockaddr*)&ClientAddr, &ClientAddrLen)) < 0)
{
if(errno!=EINTR)
{
printf("BDT_ListenerTask(%d) accept() failed\n", Port);
}
}
else
{
/* Spawn a task to handle the new connection */
printf("Accepted a connection\n");
taskSpawn("BDT", BDT_TASK_PRIO, BDT_TASK_OPTIONS, BDT_TASK_STACK, (FUNCPTR)BDT_ReceiverTask, ClientSock, 2,3,4,5,6,7,8,9,0);
}
}
/* Never reached */
}
/*****************************************************************************
*
* A handy routine to assist in debugging.
*
******************************************************************************/
STATIC int HexDump(char *ReadBuffer, int rbytes)
{
int c = 0;
int i = 0;
int firsttime;
char ascii[20]; /* To hold printable portion of string */
if (!rbytes)
return(0);
firsttime = 1;
while(c < rbytes)
{
if ((c % 16) == 0)
{
if (!firsttime)
{
ascii[i] = '\0';
printf(" *%s*\n", ascii);
}
firsttime=0;
i = 0;
}
printf(" %02.2X", ReadBuffer[c] & 0xff);
ascii[i] = ReadBuffer[c];
if (!isprint(ascii[i]))
ascii[i] = '.';
++i;
++c;
}
while (c%16)
{
fputs(" ", stdout);
++c;
}
ascii[i] = '\0';
printf(" *%s*\n", ascii);
return(0);
}

129
src/bdt/bdtServName.c Normal file
View File

@@ -0,0 +1,129 @@
/*****************************************************************************
*
* Author: John Winans
* Date: 95-06-05
*
* $Id$
*
* $Log$
*
*****************************************************************************/
#include <selectLib.h>
#include <stdio.h>
#include <signal.h>
/*****************************************************************************
*
* IOC listener task blocks on accept calls waiting for binders.
* If a bind arrives, a receiver task is spawned.
*
* IOC receiver task blocks on read calls waiting for transactions.
* When a transaction arrives it is serviced.
* At the end of a transaction service, a response is sent back.
* After the response is sent, a chack is made to see if a delta transmission
* was blocked by the transaction's use of the socket... if so, it is sent.
*
******************************************************************************/
#include <vxWorks.h>
#include <sys/socket.h>
#include <in.h>
#include <inetLib.h>
#include <taskLib.h>
#include "bdt.h"
#define STATIC static
/*****************************************************************************
*
*****************************************************************************/
STATIC int BDT_NameServiceOk(BDT *Bdt)
{
printf("BDT_NameServiceOk \n");
return(0);
}
/*****************************************************************************
*
*****************************************************************************/
STATIC int BDT_NameServiceConnect(BDT *Bdt)
{
printf("BDT_NameServiceConnect \n");
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
STATIC int BDT_NameServiceError(BDT *Bdt)
{
printf("BDT_NameServiceError \n");
return(0);
}
STATIC int BDT_NameServiceGet(BDT *Bdt)
{
printf("BDT_NameServiceGet \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServicePut(BDT *Bdt)
{
printf("BDT_NameServicePut \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServiceClose(BDT *Bdt)
{
printf("BDT_NameServiceClose \n");
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
STATIC int BDT_NameServiceMonitor(BDT *Bdt)
{
printf("BDT_NameServiceMonitor \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServiceValue(BDT *Bdt)
{
printf("BDT_NameServiceValue \n");
return(0);
}
STATIC int BDT_NameServiceDelta(BDT *Bdt)
{
printf("BDT_NameServiceDelta \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServiceAdd(BDT *Bdt)
{
printf("BDT_NameServiceAdd \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServiceDelete(BDT *Bdt)
{
printf("BDT_NameServiceDelete \n");
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
STATIC int BDT_NameServicePing(BDT *Bdt)
{
printf("BDT_NameServicePing \n");
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
BdtHandlers BDT_ServiceHandler_name =
{
BDT_NameServiceOk,
BDT_NameServiceConnect,
BDT_NameServiceError,
BDT_NameServiceGet,
BDT_NameServicePut,
BDT_NameServiceClose,
BDT_NameServiceMonitor,
BDT_NameServiceValue,
BDT_NameServiceDelta,
BDT_NameServiceAdd,
BDT_NameServiceDelete,
BDT_NameServicePing
};

377
src/bdt/bdtServPv.c Normal file
View File

@@ -0,0 +1,377 @@
/*****************************************************************************
*
* Author: John Winans
* Date: 95-06-05
*
* $Id$
*
* $Log$
*
******************************************************************************/
#include <vxWorks.h>
#include <semLib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dbCommon.h>
#include <dbAccess.h>
#include "bdt.h"
#define STATIC static
#define MESSAGE_PREFIX "BDT PV server:"
/*****************************************************************************
*
* These conversion finctions take care of one of the most insane parts
* of dealing with database access... having two different interfaces that
* have the same named enumerators in two seperate header files... that
* therefore can not be both included in the same file.
*
* This is so bad, I wanted to vomit when typing it in.
*
******************************************************************************/
STATIC int DbrOld2New(int Old)
{
switch (Old)
{
case 0: return(DBR_STRING);
case 1: return(DBR_SHORT);
case 2: return(DBR_FLOAT);
case 3: return(DBR_ENUM);
case 4: return(DBR_CHAR);
case 5: return(DBR_LONG);
case 6: return(DBR_DOUBLE);
default:
return(-1);
}
}
STATIC int DbrNew2Old(int New)
{
switch (New)
{
case DBR_STRING: return(0);
case DBR_CHAR: return(4);
case DBR_UCHAR: return(4);
case DBR_SHORT: return(1);
case DBR_USHORT: return(1);
case DBR_LONG: return(5);
case DBR_ULONG: return(5);
case DBR_FLOAT: return(2);
case DBR_DOUBLE: return(6);
case DBR_ENUM: return(3);
default:
return(-1);
}
}
/*****************************************************************************
*
* Handle the receipt of an OK message.
*
* The OK message is received as a confirmation of the last operation. It is
* not normally responded to.
*
*****************************************************************************/
STATIC int BDT_ServiceOk(BDT *Bdt)
{
printf("%s got a Ok message\n", MESSAGE_PREFIX);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Connect message.
*
* The Connect is received when a new connection is first made.
* Any arguments left in the message body have not yet been read.
*
*****************************************************************************/
STATIC int BDT_ServiceConnect(BDT *Bdt)
{
unsigned char Length;
char Buf[100];
struct dbAddr *pDbAddr;
Buf[0] = '\0';
if (Bdt->remaining_recv > 0)
{
BdtReceiveData(Bdt, &Length, 1);
if (Length <= sizeof(Buf))
{
BdtReceiveData(Bdt, Buf, Length);
Buf[Length] = '\0';
}
else
{
printf("%s Connect message argument list too long\n", MESSAGE_PREFIX);
BDT_DiscardMessage(Bdt);
return(-1);
}
}
#ifdef DEBUG_VERBOSE
printf("%s got Connect >%s<\n", MESSAGE_PREFIX, Buf);
#endif
/* Find the PV in the database */
Bdt->pService = malloc(sizeof(struct dbAddr));
pDbAddr = (struct dbAddr *)(Bdt->pService);
if (dbNameToAddr(Buf, pDbAddr))
{
BdtSendHeader(Bdt, BDT_Error, 0);
free(Bdt->pService);
}
else
{
if (pDbAddr->dbr_field_type != pDbAddr->field_type)
{
BdtSendHeader(Bdt, BDT_Error, 0);
free(Bdt->pService);
}
else
BdtSendHeader(Bdt, BDT_Ok, 0);
}
return(0);
}
/*****************************************************************************
*
* Handle the receipt of an Error message.
*
*****************************************************************************/
STATIC int BDT_ServiceError(BDT *Bdt)
{
printf("%s got a Error message\n", MESSAGE_PREFIX);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Get message.
*
* The response to a Get message is either an Error or a Value:
*
* Value message body format:
* SHORT EPICS data type enumerator (in old format)
* LONG Number of elements
* CHAR[] Value image
*
*
*****************************************************************************/
STATIC int BDT_ServiceGet(BDT *Bdt)
{
void *Buf;
struct dbAddr *pDbAddr = (struct dbAddr *)(Bdt->pService);
long NumElements;
long Size;
long l;
short OldType;
int stat;
#ifdef DEBUG_VERBOSE
printf("%s got a Get message\n", MESSAGE_PREFIX);
printf("field type=%d, field size=%d, elements=%d\n", pDbAddr->field_type, pDbAddr->field_size, pDbAddr->no_elements);
#endif
OldType = DbrNew2Old(pDbAddr->field_type);
if (OldType < 0)
{
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
/* Allocate a buffer to hold the response message data */
Buf = malloc(pDbAddr->field_size * pDbAddr->no_elements);
if (Buf == NULL)
{
printf("Can't allocate %d-byte buffer for get request to %s\n",
pDbAddr->field_size * pDbAddr->no_elements,
pDbAddr->precord->name);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
/* Get the response message data */
NumElements = pDbAddr->no_elements;
if (stat=dbGetField(pDbAddr, pDbAddr->field_type, Buf, 0, &NumElements, NULL))
{
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
#if 0
/* Test hack to transfer HUGE buffers */
NumElements = pDbAddr->no_elements;
#endif
/* Send the response message */
Size = NumElements * pDbAddr->field_size;
BdtSendHeader(Bdt, BDT_Value, Size + sizeof(long) + sizeof(short));
BdtSendData(Bdt, &OldType, sizeof(short));
BdtSendData(Bdt, &NumElements, sizeof(long));
if (Size)
BdtSendData(Bdt, Buf, Size);
free(Buf);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Put message.
*
* Put message body format:
* SHORT EPICS data type enumerator
* LONG Number of elements
* CHAR[] Value image
*
*****************************************************************************/
STATIC int BDT_ServicePut(BDT *Bdt)
{
long Size;
void *Buf;
short DbrType;
long NumElements;
struct dbAddr *pDbAddr = (struct dbAddr *)(Bdt->pService);
#ifdef DEBUG_VERBOSE
printf("%s got a Put message\n", MESSAGE_PREFIX);
#endif
if (BdtGetResidualRead(Bdt) < 6)
{
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
if (BdtGetResidualRead(Bdt) == 6)
{ /* Do data contents, just toss it */
BDT_DiscardMessage(Bdt);
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
Buf = malloc(BdtGetResidualRead(Bdt) - 6);
if (Buf == NULL)
{
printf("Can't allocate %d-byte buffer for put request to %s\n",
BdtGetResidualRead(Bdt), pDbAddr->precord->name);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
BdtReceiveData(Bdt, &DbrType, 2);
BdtReceiveData(Bdt, &NumElements, 4);
#ifdef DEBUG_VERBOSE
printf("record field type=%d, field size=%d, elements=%d\n", pDbAddr->field_type, pDbAddr->field_size, pDbAddr->no_elements);
printf("message field type=%d, field size=%d, elements=%d total %d\n", DbrType, pDbAddr->field_type ,NumElements, BdtGetResidualRead(Bdt));
#endif
BdtReceiveData(Bdt, Buf, BdtGetResidualRead(Bdt));
DbrType = DbrOld2New(DbrType);
if (DbrType < 0)
BdtSendHeader(Bdt, BDT_Error, 0);
else if (dbPutField(pDbAddr, DbrType, Buf, NumElements))
BdtSendHeader(Bdt, BDT_Error, 0);
else
BdtSendHeader(Bdt, BDT_Ok, 0);
free(Buf);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Close message.
*
*****************************************************************************/
STATIC int BDT_ServiceClose(BDT *Bdt)
{
printf("%s got a Close message\n", MESSAGE_PREFIX);
free(Bdt->pService);
BdtSendHeader(Bdt, BDT_Ok, 0);
return(1);
}
/*****************************************************************************
*
* Handle the receipt of a Monitor message.
*
* Not Supported.
*
*****************************************************************************/
STATIC int BDT_ServiceMonitor(BDT *Bdt)
{
printf("%s got a Monitor message\n", MESSAGE_PREFIX);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Value message.
*
* Not Supported.
*
*****************************************************************************/
STATIC int BDT_ServiceValue(BDT *Bdt)
{
printf("%s got a Value message\n", MESSAGE_PREFIX);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Delta message.
*
* Not Supported.
*
*****************************************************************************/
STATIC int BDT_ServiceDelta(BDT *Bdt)
{
printf("%s got a Delta message\n", MESSAGE_PREFIX);
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of an Add message.
*
* Not Supported.
*
*****************************************************************************/
STATIC int BDT_ServiceAdd(BDT *Bdt)
{
printf("%s got a Add message\n", MESSAGE_PREFIX);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Delete message.
*
* Not Supported.
*
*****************************************************************************/
STATIC int BDT_ServiceDelete(BDT *Bdt)
{
printf("%s got a Delete message\n", MESSAGE_PREFIX);
BdtSendHeader(Bdt, BDT_Error, 0);
return(0);
}
/*****************************************************************************
*
* Handle the receipt of a Ping message.
*
*****************************************************************************/
STATIC int BDT_ServicePing(BDT *Bdt)
{
printf("%s got a Ping message\n", MESSAGE_PREFIX);
BdtSendHeader(Bdt, BDT_Ok, 0);
return(0);
}
BdtHandlers BDT_ServiceHandler_pv =
{
BDT_ServiceOk,
BDT_ServiceConnect,
BDT_ServiceError,
BDT_ServiceGet,
BDT_ServicePut,
BDT_ServiceClose,
BDT_ServiceMonitor,
BDT_ServiceValue,
BDT_ServiceDelta,
BDT_ServiceAdd,
BDT_ServiceDelete,
BDT_ServicePing
};

18
src/bpt/Makefile Normal file
View File

@@ -0,0 +1,18 @@
#
# $Id$
#
# Lowest Level Directroy Makefile
# by Janet Anderson
#
# $Log$
# Revision 1.1 1994/09/07 19:25:39 jba
# New file
#
#
EPICS=../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS

11
src/bpt/Makefile.Unix Normal file
View File

@@ -0,0 +1,11 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
SRCS.c = ../makeBpt
OBJS = makeBpt
PROD = makeBpt
include $(EPICS)/config/RULES.Unix

25
src/bpt/Makefile.Vx Normal file
View File

@@ -0,0 +1,25 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -ansi
VX_WARN_YES = -Wall -pedantic
MENUS += menuConvert.h
BPTS += bptTypeJdegC.ascii
BPTS += bptTypeJdegF.ascii
BPTS += bptTypeKdegC.ascii
BPTS += bptTypeKdegF.ascii
SRCS.c = \
../cvtBpt.c
LIBOBJS = \
cvtBpt.o
LIBNAME = pbtLib
include $(EPICS)/config/RULES.Vx

142
src/bpt/bptTypeJdegC.data Normal file
View File

@@ -0,0 +1,142 @@
!header
"typeJdegC" 0 0 700 4095 .5 -210 760 1
!data
-8.096 -8.076 -8.057 -8.037 -8.017 -7.996 -7.976 -7.955 -7.934 -7.912
-7.890 -7.868 -7.846 -7.824 -7.801 -7.778 -7.755 -7.731 -7.707 -7.683
-7.659 -7.634 -7.609 -7.584 -7.559 -7.533 -7.508 -7.482 -7.455 -7.429
-7.402 -7.375 -7.348 -7.321 -7.293 -7.265 -7.237 -7.209 -7.180 -7.151
-7.122 -7.093 -7.064 -7.034 -7.004 -6.974 -6.944 -6.914 -6.883 -6.852
-6.821 -6.790 -6.758 -6.727 -6.695 -6.663 -6.630 -6.598 -6.565 -6.532
-6.499 -6.466 -6.433 -6.399 -6.365 -6.331 -6.297 -6.263 -6.228 -6.194
-6.159 -6.124 -6.089 -6.053 -6.018 -5.982 -5.946 -5.910 -5.874 -5.837
-5.801 -5.764 -5.727 -5.690 -5.653 -5.615 -5.578 -5.540 -5.502 -5.464
-5.426 -5.388 -5.349 -5.311 -5.272 -5.233 -5.194 -5.155 -5.115 -5.076
-5.036 -4.996 -4.956 -4.916 -4.876 -4.836 -4.795 -4.755 -4.714 -4.673
-4.632 -4.591 -4.550 -4.508 -4.467 -4.425 -4.383 -4.341 -4.299 -4.257
-4.215 -4.172 -4.130 -4.087 -4.044 -4.001 -3.958 -3.915 -3.872 -3.829
-3.785 -3.742 -3.698 -3.654 -3.610 -3.566 -3.522 -3.478 -3.433 -3.389
-3.344 -3.299 -3.255 -3.210 -3.165 -3.120 -3.074 -3.029 -2.984 -2.938
-2.892 -2.847 -2.801 -2.755 -2.709 -2.663 -2.617 -2.570 -2.524 -2.478
-2.431 -2.384 -2.338 -2.291 -2.244 -2.197 -2.150 -2.102 -2.055 -2.008
-1.960 -1.913 -1.865 -1.818 -1.770 -1.722 -1.674 -1.626 -1.578 -1.530
-1.481 -1.433 -1.385 -1.336 -1.288 -1.239 -1.190 -1.141 -1.093 -1.044
-0.995 -0.945 -0.896 -0.847 -0.798 -0.748 -0.699 -0.650 -0.600 -0.550
-0.501 -0.451 -0.401 -0.351 -0.301 -0.251 -0.201 -0.151 -0.101 -0.050
0.0 0.050 0.101 0.151 0.202 0.253 0.303 0.354 0.405 0.456
0.507 0.558 0.609 0.660 0.711 0.762 0.813 0.865 0.916 0.967
1.019 1.070 1.122 1.174 1.225 1.277 1.329 1.381 1.432 1.484
1.536 1.588 1.640 1.693 1.745 1.797 1.849 1.901 1.954 2.006
2.058 2.111 2.163 2.216 2.268 2.321 2.374 2.426 2.479 2.532
2.585 2.638 2.691 2.743 2.796 2.849 2.902 2.956 3.009 3.062
3.115 3.168 3.221 3.275 3.328 3.381 3.435 3.488 3.542 3.595
3.649 3.702 3.756 3.809 3.863 3.917 3.971 4.024 4.078 4.132
4.186 4.239 4.293 4.347 4.401 4.455 4.509 4.563 4.617 4.671
4.725 4.780 4.834 4.888 4.942 4.996 5.050 5.105 5.159 5.213
5.268 5.322 5.376 5.431 5.485 5.540 5.594 5.649 5.703 5.758
5.812 5.867 5.921 5.976 6.031 6.085 6.140 6.195 6.249 6.304
6.359 6.414 6.468 6.523 6.578 6.633 6.688 6.742 6.797 6.852
6.907 6.962 7.017 7.072 7.127 7.182 7.237 7.292 7.347 7.402
7.457 7.512 7.567 7.622 7.677 7.732 7.787 7.843 7.898 7.953
8.008 8.063 8.118 8.174 8.229 8.284 8.339 8.394 8.450 8.505
8.560 8.616 8.671 8.726 8.781 8.837 8.892 8.947 9.003 9.058
9.113 9.169 9.224 9.279 9.335 9.390 9.446 9.501 9.556 9.612
9.667 9.723 9.778 9.834 9.889 9.944 10.000 10.055 10.111 10.166
10.222 10.277 10.333 10.388 10.444 10.499 10.555 10.610 10.666 10.721
10.777 10.832 10.888 10.943 10.999 11.054 11.110 11.165 11.221 11.276
11.332 11.387 11.443 11.498 11.554 11.609 11.665 11.720 11.776 11.831
11.887 11.943 11.998 12.054 12.109 12.165 12.220 12.276 12.331 12.387
12.442 12.498 12.553 12.609 12.664 12.720 12.776 12.831 12.887 12.942
12.998 13.053 13.109 13.164 13.220 13.275 13.331 13.386 13.442 13.497
13.553 13.608 13.664 13.719 13.775 13.830 13.886 13.941 13.997 14.052
14.108 14.163 14.219 14.274 14.330 14.385 14.441 14.496 14.552 14.607
14.663 14.718 14.774 14.829 14.885 14.940 14.995 15.051 15.106 15.162
15.217 15.273 15.328 15.383 15.439 15.494 15.550 15.605 15.661 15.716
15.771 15.827 15.882 15.938 15.993 16.048 16.104 16.159 16.214 16.270
16.325 16.380 16.436 16.491 16.547 16.602 16.657 16.713 16.768 16.823
16.879 16.934 16.989 17.044 17.100 17.155 17.210 17.266 17.321 17.376
17.432 17.487 17.542 17.597 17.653 17.708 17.763 17.818 17.874 17.929
17.984 18.039 18.095 18.150 18.205 18.260 18.316 18.371 18.426 18.481
18.537 18.592 18.647 18.702 18.757 18.813 18.868 18.923 18.978 19.033
19.089 19.144 19.199 19.254 19.309 19.364 19.420 19.475 19.530 19.585
19.640 19.695 19.751 19.806 19.861 19.916 19.971 20.026 20.081 20.137
20.192 20.247 20.302 20.357 20.412 20.467 20.523 20.578 20.633 20.688
20.743 20.798 20.853 20.909 20.964 21.019 21.074 21.129 21.184 21.239
21.295 21.350 21.405 21.460 21.515 21.570 21.625 21.680 21.736 21.791
21.846 21.901 21.956 22.011 22.066 22.122 22.177 22.232 22.287 22.342
22.397 22.453 22.508 22.563 22.618 22.673 22.728 22.784 22.839 22.894
22.949 23.004 23.060 23.115 23.170 23.225 23.280 23.336 23.391 23.446
23.501 23.556 23.612 23.667 23.722 23.777 23.833 23.888 23.943 23.999
24.054 24.109 24.164 24.220 24.275 24.330 24.386 24.441 24.496 24.552
24.607 24.662 24.718 24.773 24.829 24.884 24.939 24.995 25.050 25.106
25.161 25.217 25.272 25.327 25.383 25.438 25.494 25.549 25.605 25.661
25.716 25.772 25.827 25.883 25.938 25.994 26.050 26.105 26.161 26.216
26.272 26.328 26.383 26.439 26.495 26.551 26.606 26.662 26.718 26.774
26.829 26.885 26.941 26.997 27.053 27.109 27.165 27.220 27.276 27.332
27.388 27.444 27.500 27.556 27.612 27.668 27.724 27.780 27.836 27.893
27.949 28.005 28.061 28.117 28.173 28.230 28.286 28.342 28.398 28.455
28.511 28.567 28.624 28.680 28.736 28.793 28.849 28.906 28.962 29.019
29.075 29.132 29.188 29.245 29.301 29.358 29.415 29.471 29.528 29.585
29.642 29.698 29.755 29.812 29.869 29.926 29.983 30.039 30.096 30.153
30.210 30.267 30.324 30.381 30.439 30.496 30.553 30.610 30.667 30.724
30.782 30.839 30.896 30.954 31.011 31.068 31.126 31.183 31.241 31.298
31.356 31.413 31.471 31.528 31.586 31.644 31.702 31.759 31.817 31.875
31.933 31.991 32.048 32.106 32.164 32.222 32.280 32.338 32.396 32.455
32.513 32.571 32.629 32.687 32.746 32.804 32.862 32.921 32.979 33.038
33.096 33.155 33.213 33.272 33.330 33.389 33.448 33.506 33.565 33.624
33.683 33.742 33.800 33.859 33.918 33.977 34.036 34.095 34.155 34.214
34.273 34.332 34.391 34.451 34.510 34.569 34.629 34.688 34.748 34.807
34.867 34.926 34.986 35.046 35.105 35.165 35.225 35.285 35.344 35.404
35.464 35.524 35.584 35.644 35.704 35.764 35.825 35.885 35.945 36.005
36.066 36.126 36.186 36.247 36.307 36.368 36.428 36.489 36.549 36.610
36.671 36.732 36.792 36.853 36.914 36.975 37.036 37.097 37.158 37.219
37.280 37.341 37.402 37.463 37.525 37.586 37.647 37.709 37.770 37.831
37.893 37.954 38.016 38.078 38.139 38.201 38.262 38.324 38.386 38.448
38.510 38.572 38.633 38.695 38.757 38.819 38.882 38.944 39.006 39.068
39.130 39.192 39.255 39.317 39.379 39.442 39.504 39.567 39.629 39.692
39.754 39.817 39.880 39.942 40.005 40.068 40.131 40.193 40.256 40.319
40.382 40.445 40.508 40.571 40.634 40.697 40.760 40.823 40.886 40.950
41.013 41.076 41.139 41.203 41.266 41.329 41.393 41.456 41.520 41.583
41.647 41.710 41.774 41.837 41.901 41.965 42.028 42.092 42.156 42.219
42.283 42.347 42.411 42.475 42.538 42.602 42.666 42.730 42.794 42.858
42.922

213
src/bpt/bptTypeJdegF.data Normal file
View File

@@ -0,0 +1,213 @@
! cvtTypeJdegF.data
"typeJdegF" 32 0 1200 4095 1.0 -350 1400 1
!
-8.137 -8.127 -8.117 -8.106 -8.096 -8.085 -8.074 -8.063 -8.052 -8.041
-8.030 -8.019 -8.008 -7.996 -7.985 -7.973 -7.962 -7.950 -7.938 -7.927
-7.915 -7.903 -7.890 -7.878 -7.866 -7.854 -7.841 -7.829 -7.816 -7.803
-7.791 -7.778 -7.765 -7.752 -7.739 -7.726 -7.712 -7.699 -7.686 -7.672
-7.659 -7.645 -7.631 -7.618 -7.604 -7.590 -7.576 -7.562 -7.548 -7.533
-7.519 -7.505 -7.490 -7.476 -7.461 -7.447 -7.432 -7.417 -7.402 -7.387
-7.372 -7.357 -7.342 -7.327 -7.311 -7.296 -7.281 -7.265 -7.250 -7.234
-7.218 -7.202 -7.187 -7.171 -7.155 -7.139 -7.122 -7.106 -7.090 -7.074
-7.057 -7.041 -7.024 -7.008 -6.991 -6.974 -6.958 -6.941 -6.924 -6.907
-6.890 -6.873 -6.856 -6.838 -6.821 -6.804 -6.786 -6.769 -6.751 -6.734
-6.716 -6.698 -6.680 -6.663 -6.645 -6.627 -6.609 -6.591 -6.572 -6.554
-6.536 -6.518 -6.499 -6.481 -6.462 -6.444 -6.425 -6.407 -6.388 -6.369
-6.350 -6.331 -6.312 -6.293 -6.274 -6.255 -6.236 -6.217 -6.198 -6.178
-6.159 -6.139 -6.120 -6.100 -6.081 -6.061 -6.041 -6.022 -6.002 -5.982
-5.962 -5.942 -5.922 -5.902 -5.882 -5.861 -5.841 -5.821 -5.801 -5.780
-5.760 -5.739 -5.719 -5.698 -5.678 -5.657 -5.636 -5.615 -5.594 -5.574
-5.553 -5.532 -5.511 -5.490 -5.468 -5.447 -5.426 -5.405 -5.383 -5.362
-5.341 -5.319 -5.298 -5.276 -5.255 -5.233 -5.211 -5.190 -5.168 -5.146
-5.124 -5.102 -5.080 -5.058 -5.036 -5.014 -4.992 -4.970 -4.948 -4.925
-4.903 -4.881 -4.858 -4.836 -4.813 -4.791 -4.768 -4.746 -4.723 -4.700
-4.678 -4.655 -4.632 -4.609 -4.586 -4.563 -4.540 -4.517 -4.494 -4.471
-4.448 -4.425 -4.402 -4.379 -4.355 -4.332 -4.309 -4.285 -4.262 -4.238
-4.215 -4.191 -4.168 -4.144 -4.120 -4.097 -4.073 -4.049 -4.025 -4.001
-3.978 -3.954 -3.930 -3.906 -3.882 -3.858 -3.833 -3.809 -3.785 -3.761
-3.737 -3.712 -3.688 -3.664 -3.639 -3.615 -3.590 -3.566 -3.541 -3.517
-3.492 -3.468 -3.443 -3.418 -3.394 -3.369 -3.344 -3.319 -3.294 -3.270
-3.245 -3.220 -3.195 -3.170 -3.145 -3.120 -3.094 -3.069 -3.044 -3.019
-2.994 -2.968 -2.943 -2.918 -2.892 -2.867 -2.842 -2.816 -2.791 -2.765
-2.740 -2.714 -2.689 -2.663 -2.637 -2.612 -2.586 -2.560 -2.534 -2.509
-2.483 -2.457 -2.431 -2.405 -2.379 -2.353 -2.327 -2.301 -2.275 -2.249
-2.223 -2.197 -2.171 -2.144 -2.118 -2.092 -2.066 -2.039 -2.013 -1.987
-1.960 -1.934 -1.908 -1.881 -1.855 -1.828 -1.802 -1.775 -1.748 -1.722
-1.695 -1.669 -1.642 -1.615 -1.589 -1.562 -1.535 -1.508 -1.481 -1.455
-1.428 -1.401 -1.374 -1.347 -1.320 -1.293 -1.266 -1.239 -1.212 -1.185
-1.158 -1.131 -1.103 -1.076 -1.049 -1.022 -0.995 -0.967 -0.940 -0.913
-0.885 -0.858 -0.831 -0.803 -0.776 -0.748 -0.721 -0.694 -0.666 -0.639
-0.611 -0.583 -0.556 -0.528 -0.501 -0.473 -0.445 -0.418 -0.390 -0.362
-0.334 -0.307 -0.279 -0.251 -0.223 -0.195 -0.168 -0.140 -0.112 -0.084
-0.056 -0.028 0.000 0.028 0.056 0.084 0.112 0.140 0.168 0.196
0.224 0.253 0.281 0.309 0.337 0.365 0.394 0.422 0.450 0.478
0.507 0.535 0.563 0.592 0.620 0.648 0.677 0.705 0.734 0.762
0.791 0.819 0.848 0.876 0.905 0.933 0.962 0.990 1.019 1.048
1.076 1.105 1.134 1.162 1.191 1.220 1.248 1.277 1.306 1.335
1.363 1.392 1.421 1.450 1.479 1.507 1.536 1.565 1.594 1.623
1.652 1.681 1.710 1.739 1.768 1.797 1.826 1.855 1.884 1.913
1.942 1.971 2.000 2.029 2.058 2.088 2.117 2.146 2.175 2.204
2.233 2.263 2.292 2.321 2.350 2.380 2.409 2.438 2.467 2.497
2.526 2.555 2.585 2.614 2.644 2.673 2.702 2.732 2.761 2.791
2.820 2.849 2.879 2.908 2.938 2.967 2.997 3.026 3.056 3.085
3.115 3.145 3.174 3.204 3.233 3.263 3.293 3.322 3.352 3.381
3.411 3.441 3.470 3.500 3.530 3.560 3.589 3.619 3.649 3.678
3.708 3.738 3.768 3.798 3.827 3.857 3.887 3.917 3.947 3.976
4.006 4.036 4.066 4.096 4.126 4.156 4.186 4.216 4.245 4.275
4.305 4.335 4.365 4.395 4.425 4.455 4.485 4.515 4.545 4.575
4.605 4.635 4.665 4.695 4.725 4.755 4.786 4.816 4.846 4.876
4.906 4.936 4.966 4.996 5.026 5.057 5.087 5.117 5.147 5.177
5.207 5.238 5.268 5.298 5.328 5.358 5.389 5.419 5.449 5.479
5.509 5.540 5.570 5.600 5.630 5.661 5.691 5.721 5.752 5.782
5.812 5.843 5.873 5.903 5.934 5.964 5.994 6.025 6.055 6.085
6.116 6.146 6.176 6.207 6.237 6.268 6.298 6.328 6.359 6.389
6.420 6.450 6.481 6.511 6.541 6.572 6.602 6.633 6.663 6.694
6.724 6.755 6.785 6.816 6.846 6.877 6.907 6.938 6.968 6.999
7.029 7.060 7.090 7.121 7.151 7.182 7.212 7.243 7.274 7.304
7.335 7.365 7.396 7.426 7.457 7.488 7.518 7.549 7.579 7.610
7.641 7.671 7.702 7.732 7.763 7.794 7.824 7.855 7.885 7.916
7.947 7.977 8.008 8.039 8.069 8.100 8.131 8.161 8.192 8.223
8.253 8.284 8.315 8.345 8.376 8.407 8.437 8.468 8.499 8.530
8.560 8.591 8.622 8.652 8.683 8.714 8.745 8.775 8.806 8.837
8.867 8.898 8.929 8.960 8.990 9.021 9.052 9.083 9.113 9.144
9.175 9.206 9.236 9.267 9.298 9.329 9.359 9.390 9.421 9.452
9.483 9.513 9.544 9.575 9.606 9.636 9.667 9.698 9.729 9.760
9.790 9.821 9.852 9.883 9.914 9.944 9.975 10.006 10.037 10.068
10.098 10.129 10.160 10.191 10.222 10.252 10.283 10.314 10.345 10.376
10.407 10.437 10.468 10.499 10.530 10.561 10.592 10.622 10.653 10.684
10.715 10.746 10.777 10.807 10.838 10.869 10.900 10.931 10.962 10.992
11.023 11.054 11.085 11.116 11.147 11.177 11.208 11.239 11.270 11.301
11.332 11.363 11.393 11.424 11.455 11.486 11.517 11.548 11.578 11.609
11.640 11.671 11.702 11.733 11.764 11.794 11.825 11.856 11.887 11.918
11.949 11.980 12.010 12.041 12.072 12.103 12.134 12.165 12.196 12.226
12.257 12.288 12.319 12.350 12.381 12.411 12.442 12.473 12.504 12.535
12.566 12.597 12.627 12.658 12.689 12.720 12.751 12.782 12.813 12.843
12.874 12.905 12.936 12.967 12.998 13.029 13.059 13.090 13.121 13.152
13.183 13.214 13.244 13.275 13.306 13.337 13.368 13.399 13.430 13.460
13.491 13.522 13.553 13.584 13.615 13.645 13.676 13.707 13.738 13.769
13.800 13.830 13.861 13.892 13.923 13.954 13.985 14.015 14.046 14.077
14.108 14.139 14.170 14.200 14.231 14.262 14.293 14.324 14.355 14.385
14.416 14.447 14.478 14.509 14.539 14.570 14.601 14.632 14.663 14.694
14.724 14.755 14.786 14.817 14.848 14.878 14.909 14.940 14.971 15.002
15.032 15.063 15.094 15.125 15.156 15.186 15.217 15.248 15.279 15.310
15.340 15.371 15.402 15.433 15.464 15.494 15.525 15.556 15.587 15.617
15.648 15.679 15.710 15.741 15.771 15.802 15.833 15.864 15.894 15.925
15.956 15.987 16.018 16.048 16.079 16.110 16.141 16.171 16.202 16.233
16.264 16.294 16.325 16.356 16.387 16.417 16.448 16.479 16.510 16.540
16.571 16.602 16.633 16.663 16.694 16.725 16.756 16.786 16.817 16.848
16.879 16.909 16.940 16.971 17.001 17.032 17.063 17.094 17.124 17.155
17.186 17.217 17.247 17.278 17.309 17.339 17.370 17.401 17.432 17.462
17.493 17.524 17.554 17.585 17.616 17.646 17.677 17.708 17.739 17.769
17.800 17.831 17.861 17.892 17.923 17.953 17.984 18.015 18.046 18.076
18.107 18.138 18.168 18.199 18.230 18.260 18.291 18.322 18.352 18.383
18.414 18.444 18.475 18.506 18.537 18.567 18.598 18.629 18.659 18.690
18.721 18.751 18.782 18.813 18.843 18.874 18.905 18.935 18.966 18.997
19.027 19.058 19.089 19.119 19.150 19.180 19.211 19.242 19.272 19.303
19.334 19.364 19.395 19.426 19.456 19.487 19.518 19.548 19.579 19.610
19.640 19.671 19.702 19.732 19.763 19.793 19.824 19.855 19.885 19.916
19.947 19.977 20.008 20.039 20.069 20.100 20.131 20.161 20.192 20.222
20.253 20.284 20.314 20.345 20.376 20.406 20.437 20.467 20.498 20.529
20.559 20.590 20.621 20.651 20.682 20.713 20.743 20.774 20.804 20.835
20.866 20.896 20.927 20.958 20.988 21.019 21.049 21.080 21.111 21.141
21.172 21.203 21.233 21.264 21.295 21.325 21.356 21.386 21.417 21.448
21.478 21.509 21.540 21.570 21.601 21.631 21.662 21.693 21.723 21.754
21.785 21.815 21.846 21.877 21.907 21.938 21.968 21.999 22.030 22.060
22.091 22.122 22.152 22.183 22.214 22.244 22.275 22.305 22.336 22.367
22.397 22.428 22.459 22.489 22.520 22.551 22.581 22.612 22.643 22.673
22.704 22.735 22.765 22.796 22.826 22.857 22.888 22.918 22.949 22.980
23.010 23.041 23.072 23.102 23.133 23.164 23.194 23.225 23.256 23.286
23.317 23.348 23.378 23.409 23.440 23.471 23.501 23.532 23.563 23.593
23.624 23.655 23.685 23.716 23.747 23.777 23.808 23.839 23.870 23.900
23.931 23.962 23.992 24.023 24.054 24.085 24.115 24.146 24.177 24.207
24.238 24.269 24.300 24.330 24.361 24.392 24.423 24.453 24.484 24.515
24.546 24.576 24.607 24.638 24.669 24.699 24.730 24.761 24.792 24.822
24.853 24.854 24.915 24.946 24.976 25.007 25.038 25.069 25.099 25.130
25.161 25.192 25.223 25.254 25.284 25.315 25.346 25.377 25.408 25.438
25.469 25.500 25.531 25.562 25.593 25.623 25.654 25.685 25.716 25.747
25.778 25.809 25.840 25.870 25.901 25.932 25.963 25.994 26.025 26.056
26.087 26.118 26.148 26.179 26.210 26.241 26.272 26.303 26.334 26.365
26.396 26.427 26.458 26.489 26.520 26.551 26.582 26.613 26.644 26.675
26.705 26.736 26.767 26.798 26.829 26.860 26.891 26.922 26.954 26.985
27.016 27.047 27.078 27.109 27.140 27.171 27.202 27.233 27.264 27.295
27.326 27.357 27.388 27.419 27.450 27.482 27.513 27.544 27.575 27.606
27.637 27.668 27.699 27.731 27.762 27.793 27.824 27.855 27.886 27.917
27.949 27.980 28.011 28.042 28.073 28.105 28.136 28.167 28.198 28.230
28.261 28.292 28.323 28.355 28.386 28.417 28.448 28.480 28.511 28.542
28.573 28.605 28.636 28.667 28.699 28.730 28.761 28.793 28.824 28.855
28.887 28.918 28.950 28.981 29.012 29.044 29.075 29.107 29.138 29.169
29.201 29.232 29.264 29.295 29.327 29.358 29.390 29.421 29.452 29.484
29.515 29.547 29.578 29.610 29.642 29.673 29.705 29.736 29.768 29.799
29.831 29.862 29.894 29.926 29.957 29.989 30.020 30.052 30.084 30.115
30.147 30.179 30.210 30.242 30.274 30.305 30.337 30.369 30.400 30.432
30.464 30.496 30.527 30.559 30.591 30.623 30.654 30.686 30.718 30.750
30.782 30.813 30.845 30.877 30.909 30.941 30.973 31.005 31.036 31.068
31.100 31.132 31.164 31.196 31.228 31.260 31.292 31.324 31.356 31.388
31.420 31.452 31.484 31.516 31.548 31.580 31.612 31.644 31.676 31.708
31.740 31.772 31.804 31.836 31.868 31.901 31.933 31.965 31.997 32.029
32.061 32.094 32.126 32.158 32.190 32.222 32.255 32.287 32.319 32.351
32.384 32.416 32.448 32.480 32.513 32.545 32.577 32.610 32.642 32.674
32.707 32.739 32.772 32.804 32.836 32.869 32.901 32.934 32.966 32.999
33.031 33.064 33.096 33.129 33.161 33.194 33.226 33.259 33.291 33.324
33.356 33.389 33.422 33.454 33.487 33.519 33.552 33.585 33.617 33.650
33.683 33.715 33.748 33.781 33.814 33.846 33.879 33.912 33.945 33.977
34.010 34.043 34.076 34.109 34.141 34.174 34.207 34.240 34.273 34.306
34.339 34.372 34.405 34.437 34.470 34.503 34.536 34.569 34.602 34.635
34.668 34.701 34.734 34.767 34.801 34.834 34.867 34.900 34.933 34.966
34.999 35.032 35.065 35.099 35.132 35.165 35.198 35.231 35.265 35.298
35.331 35.364 35.398 35.431 35.464 35.498 35.531 35.564 35.598 35.631
35.664 35.698 35.731 35.764 35.798 35.831 35.865 35.898 35.932 35.965
35.999 36.032 36.066 36.099 36.133 36.166 36.200 36.233 36.267 36.301
36.334 36.368 36.401 36.435 36.469 36.502 36.536 36.570 36.603 36.637
36.671 36.705 36.738 36.772 36.806 36.840 36.873 36.907 36.941 36.975
37.009 37.043 37.076 37.110 37.144 37.178 37.212 37.246 37.280 37.314
37.348 37.382 37.416 37.450 37.484 37.518 37.552 37.586 37.620 37.654
37.688 37.722 37.756 37.790 37.825 37.859 37.893 37.927 37.961 37.995
38.030 38.064 38.098 38.132 38.167 38.201 38.235 38.269 38.304 38.338
38.372 38.407 38.441 38.475 38.510 38.544 38.578 38.613 38.647 38.682
38.716 38.751 38.785 38.819 38.854 38.888 38.923 38.957 38.992 39.027
39.061 39.096 39.130 39.165 39.199 39.234 39.269 39.303 39.338 39.373
39.407 39.442 39.477 39.511 39.546 39.581 39.615 39.650 39.685 39.720
39.754 39.789 39.824 39.859 39.894 39.928 39.963 39.998 40.033 40.068
40.103 40.138 40.172 40.207 40.242 40.277 40.312 40.347 40.382 40.417
40.452 40.487 40.522 40.557 40.592 40.627 40.662 40.697 40.732 40.767
40.802 40.837 40.872 40.908 40.943 40.978 41.013 41.048 41.083 41.118
41.154 41.189 41.224 41.259 41.294 41.329 41.365 41.400 41.435 41.470
41.506 41.541 41.576 41.611 41.647 41.682 41.717 41.753 41.788 41.823
41.859 41.894 41.929 41.965 42.000 42.035 42.071 42.106 42.142 42.177
42.212 42.248 42.283 42.319 42.354 42.390 42.425 42.460 42.496 42.531
42.567 42.602 42.638 42.673 42.709 42.744 42.780 42.815 42.851 42.886
42.922

201
src/bpt/bptTypeKdegC.data Normal file
View File

@@ -0,0 +1,201 @@
! cvtTypeKdegC.data
"typeKdegC" 0 0 1000 4095 .5 -270 1372 1
!
-6.458 -6.457 -6.456 -6.455 -6.453 -6.452 -6.450 -6.448 -6.446 -6.444
-6.441 -6.438 -6.435 -6.432 -6.429 -6.425 -6.421 -6.417 -6.413 -6.408
-6.404 -6.399 -6.394 -6.388 -6.382 -6.377 -6.371 -6.364 -6.358 -6.351
-6.344 -6.337 -6.329 -6.322 -6.314 -6.306 -6.297 -6.289 -6.280 -6.271
-6.262 -6.253 -6.243 -6.233 -6.223 -6.213 -6.202 -6.192 -6.181 -6.170
-6.158 -6.147 -6.135 -6.123 -6.111 -6.099 -6.087 -6.074 -6.061 -6.048
-6.035 -6.021 -6.007 -5.994 -5.980 -5.965 -5.951 -5.936 -5.922 -5.907
-5.891 -5.876 -5.860 -5.845 -5.829 -5.813 -5.796 -5.780 -5.763 -5.747
-5.730 -5.712 -5.695 -5.678 -5.660 -5.642 -5.624 -5.606 -5.587 -5.569
-5.550 -5.531 -5.512 -5.493 -5.474 -5.454 -5.434 -5.414 -5.394 -5.374
-5.354 -5.333 -5.313 -5.292 -5.271 -5.249 -5.228 -5.207 -5.185 -5.163
-5.141 -5.119 -5.097 -5.074 -5.051 -5.029 -5.006 -4.983 -4.959 -4.936
-4.912 -4.889 -4.865 -4.841 -4.817 -4.792 -4.768 -4.743 -4.719 -4.694
-4.669 -4.644 -4.618 -4.593 -4.567 -4.541 -4.515 -4.489 -4.463 -4.437
-4.410 -4.384 -4.357 -4.330 -4.303 -4.276 -4.248 -4.221 -4.193 -4.166
-4.138 -4.110 -4.082 -4.053 -4.025 -3.997 -3.968 -3.939 -3.910 -3.881
-3.852 -3.823 -3.793 -3.764 -3.734 -3.704 -3.674 -3.644 -3.614 -3.584
-3.553 -3.523 -3.492 -3.461 -3.430 -3.399 -3.368 -3.337 -3.305 -3.274
-3.242 -3.211 -3.179 -3.147 -3.115 -3.082 -3.050 -3.018 -2.985 -2.953
-2.920 -2.887 -2.854 -2.821 -2.788 -2.754 -2.721 -2.687 -2.654 -2.620
-2.586 -2.552 -2.518 -2.484 -2.450 -2.416 -2.381 -2.347 -2.312 -2.277
-2.243 -2.208 -2.173 -2.137 -2.102 -2.067 -2.032 -1.996 -1.961 -1.925
-1.889 -1.853 -1.817 -1.781 -1.745 -1.709 -1.673 -1.636 -1.600 -1.563
-1.527 -1.490 -1.453 -1.416 -1.379 -1.342 -1.305 -1.268 -1.231 -1.193
-1.156 -1.118 -1.081 -1.043 -1.005 -0.968 -0.930 -0.892 -0.854 -0.816
-0.777 -0.739 -0.701 -0.662 -0.624 -0.585 -0.547 -0.508 -0.469 -0.431
-0.392 -0.353 -0.314 -0.275 -0.236 -0.197 -0.157 -0.118 -0.079 -0.039
0.000 0.039 0.079 0.119 0.158 0.198 0.238 0.277 0.317 0.357
0.397 0.437 0.477 0.517 0.557 0.597 0.637 0.677 0.718 0.758
0.798 0.838 0.879 0.919 0.960 1.000 1.041 1.081 1.122 1.162
1.203 1.244 1.285 1.325 1.366 1.407 1.448 1.489 1.529 1.570
1.611 1.652 1.693 1.734 1.776 1.817 1.858 1.899 1.940 1.981
2.022 2.064 2.105 2.146 2.188 2.229 2.270 2.312 2.353 2.394
2.436 2.477 2.519 2.560 2.601 2.643 2.684 2.726 2.767 2.809
2.850 2.892 2.933 2.975 3.016 3.058 3.100 3.141 3.183 3.224
3.266 3.307 3.349 3.390 3.432 3.473 3.515 3.556 3.598 3.639
3.681 3.722 3.764 3.805 3.847 3.888 3.930 3.971 4.012 4.054
4.095 4.137 4.178 4.219 4.261 4.302 4.343 4.384 4.426 4.467
4.508 4.549 4.590 4.632 4.673 4.714 4.755 4.796 4.837 4.878
4.919 4.960 5.001 5.042 5.083 5.124 5.164 5.205 5.246 5.287
5.327 5.368 5.409 5.450 5.490 5.531 5.571 5.612 5.652 5.693
5.733 5.774 5.814 5.855 5.895 5.936 5.976 6.016 6.057 6.097
6.137 6.177 6.218 6.258 6.298 6.338 6.378 6.419 6.459 6.499
6.539 6.579 6.619 6.659 6.699 6.739 6.779 6.819 6.859 6.899
6.939 6.979 7.019 7.059 7.099 7.139 7.179 7.219 7.259 7.299
7.338 7.378 7.418 7.458 7.498 7.538 7.578 7.618 7.658 7.697
7.737 7.777 7.817 7.857 7.897 7.937 7.977 8.017 8.057 8.097
8.137 8.177 8.216 8.256 8.296 8.336 8.376 8.416 8.456 8.497
8.537 8.577 8.617 8.657 8.697 8.737 8.777 8.817 8.857 8.898
8.938 8.978 9.018 9.058 9.099 9.139 9.179 9.220 9.260 9.300
9.341 9.381 9.421 9.462 9.502 9.543 9.583 9.624 9.664 9.705
9.745 9.786 9.826 9.867 9.907 9.948 9.989 10.029 10.070 10.111
10.151 10.192 10.233 10.274 10.315 10.355 10.396 10.437 10.478 10.519
10.560 10.600 10.641 10.682 10.723 10.764 10.805 10.846 10.887 10.928
10.969 11.010 11.051 11.093 11.134 11.175 11.216 11.257 11.298 11.339
11.381 11.422 11.463 11.504 11.546 11.587 11.628 11.669 11.711 11.752
11.793 11.835 11.876 11.918 11.959 12.000 12.042 12.083 12.125 12.166
12.207 12.249 12.290 12.332 12.373 12.415 12.456 12.498 12.539 12.581
12.623 12.664 12.706 12.747 12.789 12.831 12.872 12.914 12.955 12.997
13.039 13.080 13.122 13.164 13.205 13.247 13.289 13.331 13.372 13.414
13.456 13.497 13.539 13.581 13.623 13.665 13.706 13.748 13.790 13.832
13.874 13.915 13.957 13.999 14.041 14.083 14.125 14.167 14.208 14.250
14.292 14.334 14.376 14.418 14.460 14.502 14.544 14.586 14.628 14.670
14.712 14.754 14.796 14.838 14.880 14.922 14.964 15.006 15.048 15.090
15.132 15.174 15.216 15.258 15.300 15.342 15.384 15.426 15.468 15.510
15.552 15.594 15.636 15.679 15.721 15.763 15.805 15.847 15.889 15.931
15.974 16.016 16.058 16.100 16.142 16.184 16.227 16.269 16.311 16.353
16.395 16.438 16.480 16.522 16.564 16.607 16.649 16.691 16.733 16.776
16.818 16.860 16.902 16.945 16.987 17.029 17.072 17.114 17.156 17.199
17.241 17.283 17.326 17.368 17.410 17.453 17.495 17.537 17.580 17.622
17.664 17.707 17.749 17.792 17.834 17.876 17.919 17.961 18.004 18.046
18.088 18.131 18.173 18.216 18.258 18.301 18.343 18.385 18.428 18.470
18.513 18.555 18.598 18.640 18.683 18.725 18.768 18.810 18.853 18.895
18.938 18.980 19.023 19.065 19.108 19.150 19.193 19.235 19.278 19.320
19.363 19.405 19.448 19.490 19.533 19.576 19.618 19.661 19.703 19.746
19.788 19.831 19.873 19.916 19.959 20.001 20.044 20.086 20.129 20.172
20.214 20.257 20.299 20.342 20.385 20.427 20.470 20.512 20.555 20.598
20.640 20.683 20.725 20.768 20.811 20.853 20.896 20.938 20.981 21.024
21.066 21.109 21.152 21.194 21.237 21.280 21.322 21.365 21.407 21.450
21.493 21.535 21.578 21.621 21.663 21.706 21.749 21.791 21.834 21.876
21.919 21.962 22.004 22.047 22.090 22.132 22.175 22.218 22.260 22.303
22.346 22.388 22.431 22.473 22.516 22.559 22.601 22.644 22.687 22.729
22.772 22.815 22.857 22.900 22.942 22.985 23.028 23.070 23.113 23.156
23.198 23.241 23.284 23.326 23.369 23.411 23.454 23.497 23.539 23.582
23.624 23.667 23.710 23.752 23.795 23.837 23.880 23.923 23.965 24.008
24.050 24.093 24.136 24.178 24.221 24.263 24.306 24.348 24.391 24.434
24.476 24.519 24.561 24.604 24.646 24.689 24.731 24.774 24.817 24.859
24.902 24.944 24.987 25.029 25.072 25.114 25.157 25.199 25.242 25.284
25.327 25.369 25.412 25.454 25.497 25.539 25.582 25.624 25.666 25.709
25.751 25.794 25.836 25.879 25.921 25.964 26.006 26.048 26.091 26.133
26.176 26.218 26.260 26.303 26.345 26.387 26.430 26.472 26.515 26.557
26.599 26.642 26.684 26.726 26.769 26.811 26.853 26.896 26.938 26.980
27.022 27.065 27.107 27.149 27.192 27.234 27.276 27.318 27.361 27.403
27.445 27.487 27.529 27.572 27.614 27.656 27.698 27.740 27.783 27.825
27.867 27.909 27.951 27.993 28.035 28.078 28.120 28.162 28.204 28.246
28.288 28.330 28.372 28.414 28.456 28.498 28.540 28.583 28.625 28.667
28.709 28.751 28.793 28.835 28.877 28.919 28.961 29.002 29.044 29.086
29.128 29.170 29.212 29.254 29.296 29.338 29.380 29.422 29.464 29.505
29.547 29.589 29.631 29.673 29.715 29.756 29.798 29.840 29.882 29.924
29.965 30.007 30.049 30.091 30.132 30.174 30.216 30.257 30.299 30.341
30.383 30.424 30.466 30.508 30.549 30.591 30.632 30.674 30.716 30.757
30.799 30.840 30.882 30.924 30.965 31.007 31.048 31.090 31.131 31.173
31.214 31.256 31.297 31.339 31.380 31.422 31.463 31.504 31.546 31.587
31.629 31.670 31.712 31.753 31.794 31.836 31.877 31.918 31.960 32.001
32.042 32.084 32.125 32.166 32.207 32.249 32.290 32.331 32.372 32.414
32.455 32.496 32.537 32.578 32.619 32.661 32.702 32.743 32.784 32.825
32.866 32.907 32.948 32.990 33.031 33.072 33.113 33.154 33.195 33.236
33.277 33.318 33.359 33.400 33.441 33.482 33.523 33.564 33.604 33.645
33.686 33.727 33.768 33.809 33.850 33.891 33.931 33.972 34.013 34.054
34.095 34.136 34.176 34.217 34.258 34.299 34.339 34.380 34.421 34.461
34.502 34.543 34.583 34.624 34.665 34.705 34.746 34.787 34.827 34.868
34.909 34.949 34.990 35.030 35.071 35.111 35.152 35.192 35.233 35.273
35.314 35.354 35.395 35.435 35.476 35.516 35.557 35.597 35.637 35.678
35.718 35.758 35.799 35.839 35.880 35.920 35.960 36.000 36.041 36.081
36.121 36.162 36.202 36.242 36.282 36.323 36.363 36.403 36.443 36.483
36.524 36.564 36.604 36.644 36.684 36.724 36.764 36.804 36.844 36.885
36.925 36.965 37.005 37.045 37.085 37.125 37.165 37.205 37.245 37.285
37.325 37.365 37.405 37.445 37.484 37.524 37.564 37.604 37.644 37.684
37.724 37.764 37.803 37.843 37.883 37.923 37.963 38.002 38.042 38.082
38.122 38.162 38.201 38.241 38.281 38.320 38.360 38.400 38.439 38.479
38.519 38.558 38.598 38.638 38.677 38.717 38.756 38.796 38.836 38.875
38.915 38.954 38.994 39.033 39.073 39.112 39.152 39.191 39.231 39.270
39.310 39.349 39.388 39.428 39.467 39.507 39.546 39.585 39.625 39.644
39.703 39.743 39.782 39.821 39.861 39.900 39.939 39.979 40.018 40.057
40.096 40.136 40.175 40.214 40.253 40.292 40.332 40.371 40.410 40.449
40.488 40.527 40.566 40.605 40.645 40.684 40.723 40.762 40.801 40.840
40.879 40.918 40.957 40.996 41.035 41.074 41.113 41.152 41.191 41.230
41.269 41.308 41.347 41.385 41.424 41.463 41.502 41.541 41.580 41.619
41.657 41.696 41.735 41.774 41.813 41.851 41.890 41.929 41.968 42.006
42.045 42.084 42.123 42.161 42.200 42.239 42.277 42.316 42.355 42.393
42.432 42.470 42.509 42.548 42.586 42.625 42.663 42.702 42.740 42.779
42.817 42.856 42.894 42.933 42.971 43.010 43.048 43.087 43.125 43.164
43.202 43.240 43.279 43.317 43.356 43.394 43.432 43.471 43.509 43.547
43.585 43.624 43.662 43.700 43.739 43.777 43.815 43.853 43.891 43.930
43.968 44.006 44.044 44.082 44.121 44.159 44.197 44.235 44.273 44.311
44.349 44.387 44.425 44.463 44.501 44.539 44.577 44.615 44.653 44.691
44.729 44.767 44.805 44.843 44.881 44.919 44.957 44.995 45.033 45.070
45.108 45.146 45.184 45.222 45.260 45.297 45.335 45.373 45.411 45.448
45.486 45.524 45.561 45.599 45.637 45.675 45.712 45.750 45.787 45.825
45.863 45.900 45.938 45.975 46.013 46.051 46.088 46.126 46.163 46.201
46.238 46.275 46.313 46.350 46.388 46.425 46.463 46.500 46.537 46.575
46.612 46.649 46.687 46.724 46.761 46.799 46.836 46.873 46.910 46.948
46.985 47.022 47.059 47.096 47.134 47.171 47.208 47.245 47.282 47.319
47.356 47.393 47.430 47.468 47.505 47.542 47.579 47.616 47.653 47.689
47.726 47.763 47.800 47.837 47.874 47.911 47.948 47.985 48.021 48.058
48.095 48.132 48.169 48.205 48.242 48.279 48.316 48.352 48.389 48.426
48.462 48.499 48.536 48.572 48.609 48.645 48.682 48.718 48.755 48.792
48.828 48.865 48.901 48.937 48.974 49.010 49.047 49.083 49.120 49.156
49.192 49.229 49.265 49.301 49.338 49.374 49.410 49.446 49.483 49.519
49.555 49.591 49.627 49.663 49.700 49.736 49.772 49.808 49.844 49.880
49.916 49.952 49.988 50.024 50.060 50.096 50.132 50.168 50.204 50.240
50.276 50.311 50.347 50.383 50.419 50.455 50.491 50.526 50.562 50.598
50.633 50.669 50.705 50.741 50.776 50.812 50.847 50.883 50.919 50.954
50.990 51.025 51.061 51.096 51.132 51.167 51.203 51.238 51.274 51.309
51.344 51.380 51.415 51.450 51.486 51.521 51.556 51.592 51.627 51.662
51.697 51.733 51.768 51.803 51.838 51.873 51.908 51.943 51.979 52.014
52.049 52.084 52.119 52.154 52.189 52.224 52.259 52.294 52.329 52.364
52.398 52.433 52.468 52.503 52.538 52.573 52.608 52.642 52.677 52.712
52.747 52.781 52.816 52.851 52.886 52.920 52.955 52.989 53.024 53.059
53.093 53.128 53.162 53.197 53.232 53.266 53.301 53.335 53.370 53.404
53.439 53.473 53.507 53.542 53.576 53.611 53.645 53.679 53.714 53.748
53.782 53.817 53.851 53.885 53.920 53.954 53.988 54.022 54.057 54.091
54.125 54.159 54.193 54.228 54.262 54.296 54.330 54.364 54.398 54.432
54.466 54.501 54.535 54.569 54.603 54.637 54.671 54.705 54.739 54.773
54.807 54.841 54.875

360
src/bpt/bptTypeKdegF.data Normal file
View File

@@ -0,0 +1,360 @@
! cvtTypeKdegF.data
"typeKdegF" 32 0 1832 4095 1.0 -454 2500 1
!
-6.458 -6.457 -6.457 -6.456
-6.456 -6.455 -6.454 -6.454 -6.453 -6.452 -6.451 -6.450 -6.449 -6.448
-6.447 -6.445 -6.444 -6.443 -6.441 -6.440 -6.438 -6.436 -6.435 -6.433
-6.431 -6.429 -6.427 -6.425 -6.423 -6.421 -6.419 -6.416 -6.414 -6.411
-6.409 -6.406 -6.404 -6.401 -6.398 -6.395 -6.392 -6.389 -6.386 -6.383
-6.380 -6.377 -6.373 -6.370 -6.366 -6.363 -6.359 -6.355 -6.352 -6.348
-6.344 -6.340 -6.336 -6.332 -6.328 -6.323 -6.319 -6.315 -6.310 -6.306
-6.301 -6.296 -6.292 -6.287 -6.282 -6.277 -6.272 -6.267 -6.262 -6.257
-6.251 -6.246 -6.241 -6.235 -6.230 -6.224 -6.219 -6.213 -6.207 -6.201
-6.195 -6.189 -6.183 -6.177 -6.171 -6.165 -6.158 -6.152 -6.146 -6.139
-6.133 -6.126 -6.119 -6.113 -6.106 -6.099 -6.092 -6.085 -6.078 -6.071
-6.064 -6.057 -6.049 -6.042 -6.035 -6.027 -6.020 -6.012 -6.004 -5.997
-5.989 -5.981 -5.973 -5.965 -5.957 -5.949 -5.941 -5.933 -5.925 -5.917
-5.908 -5.900 -5.891 -5.883 -5.874 -5.866 -5.857 -5.848 -5.839 -5.831
-5.822 -5.813 -5.804 -5.795 -5.786 -5.776 -5.767 -5.758 -5.748 -5.739
-5.730 -5.720 -5.711 -5.701 -5.691 -5.682 -5.672 -5.662 -5.652 -5.642
-5.632 -5.622 -5.612 -5.602 -5.592 -5.581 -5.571 -5.561 -5.550 -5.540
-5.529 -5.519 -5.508 -5.497 -5.487 -5.476 -5.465 -5.454 -5.443 -5.432
-5.421 -5.410 -5.399 -5.388 -5.376 -5.365 -5.354 -5.342 -5.331 -5.319
-5.308 -5.296 -5.285 -5.273 -5.261 -5.249 -5.238 -5.226 -5.214 -5.202
-5.190 -5.178 -5.165 -5.153 -5.141 -5.129 -5.116 -5.104 -5.092 -5.079
-5.067 -5.054 -5.041 -5.029 -5.016 -5.003 -4.990 -4.978 -4.965 -4.952
-4.939 -4.926 -4.912 -4.899 -4.886 -4.873 -4.860 -4.846 -4.833 -4.819
-4.806 -4.792 -4.779 -4.765 -4.752 -4.738 -4.724 -4.710 -4.697 -4.683
-4.669 -4.655 -4.641 -4.627 -4.613 -4.598 -4.584 -4.570 -4.556 -4.541
-4.527 -4.512 -4.498 -4.484 -4.469 -4.454 -4.440 -4.425 -4.410 -4.396
-4.381 -4.366 -4.351 -4.336 -4.321 -4.306 -4.291 -4.276 -4.261 -4.245
-4.230 -4.215 -4.200 -4.184 -4.169 -4.153 -4.138 -4.122 -4.107 -4.091
-4.075 -4.060 -4.044 -4.028 -4.012 -3.997 -3.981 -3.965 -3.949 -3.933
-3.917 -3.901 -3.884 -3.868 -3.852 -3.836 -3.819 -3.803 -3.787 -3.770
-3.754 -3.737 -3.721 -3.704 -3.688 -3.671 -3.654 -3.637 -3.621 -3.604
-3.587 -3.570 -3.553 -3.536 -3.519 -3.502 -3.485 -3.468 -3.451 -3.434
-3.417 -3.399 -3.382 -3.365 -3.347 -3.330 -3.312 -3.295 -3.277 -3.260
-3.242 -3.225 -3.207 -3.189 -3.172 -3.154 -3.136 -3.118 -3.100 -3.082
-3.065 -3.047 -3.029 -3.010 -2.992 -2.974 -2.956 -2.938 -2.920 -2.902
-2.883 -2.865 -2.847 -2.828 -2.810 -2.791 -2.773 -2.754 -2.736 -2.717
-2.699 -2.680 -2.661 -2.643 -2.624 -2.605 -2.586 -2.567 -2.549 -2.530
-2.511 -2.492 -2.473 -2.454 -2.435 -2.416 -2.397 -2.377 -2.358 -2.339
-2.320 -2.300 -2.281 -2.262 -2.243 -2.223 -2.204 -2.184 -2.165 -2.145
-2.126 -2.106 -2.087 -2.067 -2.047 -2.028 -2.008 -1.988 -1.968 -1.949
-1.929 -1.909 -1.889 -1.869 -1.849 -1.829 -1.809 -1.789 -1.769 -1.749
-1.729 -1.709 -1.689 -1.669 -1.648 -1.628 -1.608 -1.588 -1.567 -1.547
-1.527 -1.506 -1.486 -1.465 -1.445 -1.424 -1.404 -1.383 -1.363 -1.342
-1.322 -1.301 -1.280 -1.260 -1.239 -1.218 -1.197 -1.177 -1.156 -1.135
-1.114 -1.093 -1.072 -1.051 -1.031 -1.010 -0.989 -0.968 -0.946 -0.925
-0.904 -0.883 -0.862 -0.841 -0.820 -0.799 -0.777 -0.756 -0.735 -0.714
-0.692 -0.671 -0.650 -0.628 -0.607 -0.585 -0.564 -0.543 -0.521 -0.500
-0.478 -0.457 -0.435 -0.413 -0.392 -0.370 -0.349 -0.327 -0.305 -0.284
-0.262 -0.240 -0.218 -0.197 -0.175 -0.153 -0.131 -0.109 -0.088 -0.066
-0.044 -0.022 0.000 0.022 0.044 0.066 0.088 0.110 0.132 0.154
0.176 0.198 0.220 0.242 0.264 0.286 0.308 0.331 0.353 0.375
0.397 0.419 0.441 0.464 0.486 0.508 0.530 0.553 0.575 0.597
0.619 0.642 0.664 0.686 0.709 0.731 0.753 0.776 0.798 0.821
0.843 0.865 0.888 0.910 0.933 0.955 0.978 1.000 1.023 1.045
1.068 1.090 1.113 1.135 1.158 1.181 1.203 1.226 1.248 1.271
1.294 1.316 1.339 1.362 1.384 1.407 1.430 1.452 1.475 1.498
1.520 1.543 1.566 1.589 1.611 1.634 1.657 1.680 1.703 1.725
1.748 1.771 1.794 1.817 1.839 1.862 1.885 1.908 1.931 1.954
1.977 2.000 2.022 2.045 2.068 2.091 2.114 2.137 2.160 2.183
2.206 2.229 2.252 2.275 2.298 2.321 2.344 2.367 2.390 2.413
2.436 2.459 2.482 2.505 2.528 2.551 2.574 2.597 2.620 2.643
2.666 2.689 2.712 2.735 2.758 2.781 2.804 2.827 2.850 2.873
2.896 2.920 2.943 2.966 2.989 3.012 3.035 3.058 3.081 3.104
3.127 3.150 3.173 3.196 3.220 3.243 3.266 3.289 3.312 3.335
3.358 3.381 3.404 3.427 3.450 3.473 3.496 3.519 3.543 3.566
3.589 3.612 3.635 3.658 3.681 3.704 3.727 3.750 3.773 3.796
3.819 3.842 3.865 3.888 3.911 3.934 3.957 3.980 4.003 4.026
4.049 4.072 4.095 4.118 4.141 4.164 4.187 4.210 4.233 4.256
4.279 4.302 4.325 4.348 4.371 4.394 4.417 4.439 4.462 4.485
4.508 4.531 4.554 4.577 4.600 4.622 4.645 4.668 4.691 4.714
4.737 4.759 4.782 4.805 4.828 4.851 4.873 4.896 4.919 4.942
4.964 4.987 5.010 5.033 5.055 5.078 5.101 5.124 5.146 5.169
5.192 5.214 5.237 5.260 5.282 5.305 5.327 5.350 5.373 5.395
5.418 5.440 5.463 5.486 5.508 5.531 5.553 5.576 5.598 5.621
5.643 5.666 5.688 5.711 5.733 5.756 5.778 5.801 5.823 5.846
5.868 5.891 5.913 5.936 5.958 5.980 6.003 6.025 6.048 6.070
6.092 6.115 6.137 6.160 6.182 6.204 6.227 6.249 6.271 6.294
6.316 6.338 6.361 6.383 6.405 6.428 6.450 6.472 6.494 6.517
6.539 6.561 6.583 6.606 6.628 6.650 6.672 6.695 6.717 6.739
6.761 6.784 6.806 6.828 6.850 6.873 6.895 6.917 6.939 6.961
6.984 7.006 7.028 7.050 7.072 7.094 7.117 7.139 7.161 7.183
7.205 7.228 7.250 7.272 7.294 7.316 7.338 7.361 7.383 7.405
7.427 7.449 7.471 7.494 7.516 7.538 7.560 7.582 7.604 7.627
7.649 7.671 7.693 7.715 7.737 7.760 7.782 7.804 7.826 7.848
7.870 7.893 7.915 7.937 7.959 7.981 8.003 8.026 8.048 8.070
8.092 8.114 8.137 8.159 8.181 8.203 8.225 8.248 8.270 8.292
8.314 8.336 8.359 8.381 8.403 8.425 8.448 8.470 8.492 8.514
8.537 8.559 8.581 8.603 8.626 8.648 8.670 8.692 8.715 8.737
8.759 8.782 8.804 8.826 8.849 8.871 8.893 8.916 8.938 8.960
8.983 9.005 9.027 9.050 9.072 9.094 9.117 9.139 9.161 9.184
9.206 9.229 9.251 9.273 9.296 9.318 9.341 9.363 9.385 9.408
9.430 9.453 9.475 9.498 9.520 9.543 9.565 9.588 9.610 9.633
9.655 9.678 9.700 9.723 9.745 9.768 9.790 9.813 9.835 9.858
9.880 9.903 9.926 9.948 9.971 9.993 10.016 10.038 10.061 10.084
10.106 10.129 10.151 10.174 10.197 10.219 10.242 10.265 10.287 10.310
10.333 10.355 10.378 10.401 10.423 10.446 10.469 10.491 10.514 10.537
10.560 10.582 10.605 10.628 10.650 10.673 10.696 10.719 10.741 10.764
10.787 10.810 10.833 10.855 10.878 10.901 10.924 10.947 10.969 10.992
11.015 11.038 11.061 11.083 11.106 11.129 11.152 11.175 11.198 11.221
11.243 11.266 11.289 11.312 11.335 11.358 11.381 11.404 11.426 11.449
11.472 11.495 11.518 11.541 11.564 11.587 11.610 11.633 11.656 11.679
11.702 11.725 11.748 11.770 11.793 11.816 11.839 11.862 11.885 11.908
11.931 11.954 11.977 12.000 12.023 12.046 12.069 12.092 12.115 12.138
12.161 12.184 12.207 12.230 12.254 12.277 12.300 12.323 12.346 12.369
12.392 12.415 12.438 12.461 12.484 12.507 12.530 12.553 12.576 12.599
12.623 12.646 12.669 12.692 12.715 12.738 12.761 12.784 12.807 12.831
12.854 12.877 12.900 12.923 12.946 12.969 12.992 13.016 13.039 13.062
13.085 13.108 13.131 13.154 13.178 13.201 13.224 13.247 13.270 13.293
13.317 13.340 13.363 13.386 13.409 13.433 13.456 13.479 13.502 13.525
13.549 13.572 13.595 13.618 13.641 13.665 13.688 13.711 13.734 13.757
13.781 13.804 13.827 13.850 13.874 13.897 13.920 13.943 13.967 13.990
14.013 14.036 14.060 14.083 14.106 14.129 14.153 14.176 14.199 14.222
14.246 14.269 14.292 14.316 14.339 14.362 14.385 14.409 14.432 14.455
14.479 14.502 14.525 14.548 14.572 14.595 14.618 14.642 14.665 14.688
14.712 14.735 14.758 14.782 14.805 14.828 14.852 14.875 14.898 14.922
14.945 14.968 14.992 15.015 15.038 15.062 15.085 15.108 15.132 15.155
15.178 15.202 15.225 15.248 15.272 15.295 15.318 15.342 15.365 15.389
15.412 15.435 15.459 15.482 15.505 15.529 15.552 15.576 15.599 15.622
15.646 15.669 15.693 15.716 15.739 15.763 15.786 15.810 15.833 15.856
15.880 15.903 15.927 15.950 15.974 15.997 16.020 16.044 16.067 16.091
16.114 16.138 16.161 16.184 16.208 16.231 16.255 16.278 16.302 16.325
16.349 16.372 16.395 16.419 16.442 16.466 16.489 16.513 16.536 16.560
16.583 16.607 16.630 16.654 16.677 16.700 16.724 16.747 16.771 16.794
16.818 16.841 16.865 16.888 16.912 16.935 16.959 16.982 17.006 17.029
17.053 17.076 17.100 17.123 17.147 17.170 17.194 17.217 17.241 17.264
17.288 17.311 17.335 17.358 17.382 17.406 17.429 17.453 17.476 17.500
17.523 17.547 17.570 17.594 17.617 17.641 17.664 17.688 17.711 17.735
17.759 17.782 17.806 17.829 17.853 17.876 17.900 17.923 17.947 17.971
17.994 18.018 18.041 18.065 18.088 18.112 18.136 18.159 18.183 18.206
18.230 18.253 18.277 18.301 18.324 18.348 18.371 18.395 18.418 18.442
18.466 18.489 18.513 18.536 18.560 18.584 18.607 18.631 18.654 18.678
18.702 18.725 18.749 18.772 18.796 18.820 18.843 18.867 18.890 18.914
18.938 18.961 18.985 19.008 19.032 19.056 19.079 19.103 19.127 19.150
19.174 19.197 19.221 19.245 19.268 19.292 19.316 19.339 19.363 19.386
19.410 19.434 19.457 19.481 19.505 19.528 19.552 19.576 19.599 19.623
19.646 19.670 19.694 19.717 19.741 19.765 19.788 19.812 19.836 19.859
19.883 19.907 19.930 19.954 19.978 20.001 20.025 20.049 20.072 20.096
20.120 20.143 20.167 20.190 20.214 20.238 20.261 20.285 20.309 20.332
20.356 20.380 20.403 20.427 20.451 20.474 20.498 20.522 20.545 20.569
20.593 20.616 20.640 20.664 20.688 20.711 20.735 20.759 20.782 20.806
20.830 20.853 20.877 20.901 20.924 20.948 20.972 20.995 21.019 21.043
21.066 21.090 21.114 21.137 21.161 21.185 21.208 21.232 21.256 21.280
21.303 21.327 21.351 21.374 21.398 21.422 21.445 21.469 21.493 21.516
21.540 21.564 21.587 21.611 21.635 21.659 21.682 21.706 21.730 21.753
21.777 21.801 21.824 21.848 21.872 21.895 21.919 21.943 21.966 21.990
22.014 22.038 22.061 22.085 22.109 22.132 22.156 22.180 22.203 22.227
22.251 22.274 22.298 22.322 22.346 22.369 22.393 22.417 22.440 22.464
22.488 22.511 22.535 22.559 22.582 22.606 22.630 22.654 22.677 22.701
22.725 22.748 22.772 22.796 22.819 22.843 22.867 22.890 22.914 22.938
22.961 22.985 23.009 23.032 23.056 23.080 23.104 23.127 23.151 23.175
23.198 23.222 23.246 23.269 23.293 23.317 23.340 23.364 23.388 23.411
23.435 23.459 23.482 23.506 23.530 23.553 23.577 23.601 23.624 23.648
23.672 23.695 23.719 23.743 23.766 23.790 23.814 23.837 23.861 23.885
23.908 23.932 23.956 23.979 24.003 24.027 24.050 24.074 24.098 24.121
24.145 24.169 24.192 24.216 24.240 24.263 24.287 24.311 24.334 24.358
24.382 24.405 24.429 24.453 24.476 24.500 24.523 24.547 24.571 24.594
24.618 24.642 24.665 24.689 24.713 24.736 24.760 24.783 24.807 24.831
24.854 24.878 24.902 24.925 24.949 24.972 24.996 25.020 25.043 25.067
25.091 25.114 25.138 25.161 25.185 25.209 25.232 25.256 25.279 25.303
25.327 25.350 25.374 25.397 25.421 25.445 25.468 25.492 25.515 25.539
25.563 25.586 25.610 25.633 25.657 25.681 25.704 25.728 25.751 25.775
25.799 25.822 25.846 25.869 25.893 25.916 25.940 25.964 25.987 26.011
26.034 26.058 26.081 26.105 26.128 26.152 26.176 26.199 26.223 26.246
26.270 26.293 26.317 26.340 26.364 26.387 26.411 26.435 26.458 26.482
26.505 26.529 26.552 26.576 26.599 26.623 26.646 26.670 26.693 26.717
26.740 26.764 26.787 26.811 26.834 26.858 26.881 26.905 26.928 26.952
26.975 26.999 27.022 27.046 27.069 27.093 27.116 27.140 27.163 27.187
27.210 27.234 27.257 27.281 27.304 27.328 27.351 27.375 27.398 27.422
27.445 27.468 27.492 27.515 27.539 27.562 27.586 27.609 27.633 27.656
27.679 27.703 27.726 27.750 27.773 27.797 27.820 27.843 27.867 27.890
27.914 27.937 27.961 27.984 28.007 28.031 28.054 28.078 28.101 28.124
28.148 28.171 28.195 28.218 28.241 28.265 28.288 28.311 28.335 28.358
28.382 28.405 28.428 28.452 28.475 28.498 28.522 28.545 28.569 28.592
28.615 28.639 28.662 28.685 28.709 28.732 28.755 28.779 28.802 28.825
28.849 28.872 28.895 28.919 28.942 28.965 28.988 29.012 29.035 29.058
29.082 29.105 29.128 29.152 29.175 29.198 29.221 29.245 29.268 29.291
29.315 29.338 29.361 29.384 29.408 29.431 29.454 29.477 29.501 29.524
29.547 29.570 29.594 29.617 29.640 29.663 29.687 29.710 29.733 29.756
29.780 29.803 29.826 29.849 29.872 29.896 29.919 29.942 29.965 29.989
30.012 30.035 30.058 30.081 30.104 30.128 30.151 30.174 30.197 30.220
30.244 30.267 30.290 30.313 30.336 30.359 30.383 30.406 30.429 30.452
30.475 30.498 30.521 30.545 30.568 30.591 30.614 30.637 30.660 30.683
30.706 30.730 30.753 30.776 30.799 30.822 30.845 30.868 30.891 30.914
30.937 30.961 30.984 31.007 31.030 31.053 31.076 31.099 31.122 31.145
31.168 31.191 31.214 31.237 31.260 31.283 31.306 31.329 31.353 31.376
31.399 31.422 31.445 31.468 31.491 31.514 31.537 31.560 31.583 31.606
31.629 31.652 31.675 31.698 31.721 31.744 31.767 31.790 31.813 31.836
31.859 31.882 31.905 31.927 31.950 31.973 31.996 32.019 32.042 32.065
32.088 32.111 32.134 32.157 32.180 32.203 32.226 32.249 32.272 32.294
32.317 32.340 32.363 32.386 32.409 32.432 32.455 32.478 32.501 32.523
32.546 32.569 32.592 32.615 32.638 32.661 32.683 32.706 32.729 32.752
32.775 32.798 32.821 32.843 32.866 32.889 32.912 32.935 32.958 32.980
33.003 33.026 33.049 33.072 33.094 33.117 33.140 33.163 33.186 33.208
33.231 33.254 33.277 33.300 33.322 33.345 33.368 33.391 33.413 33.436
33.459 33.482 33.504 33.527 33.550 33.573 33.595 33.618 33.641 33.664
33.686 33.709 33.732 33.754 33.777 33.800 33.823 33.845 33.868 33.891
33.913 33.936 33.959 33.981 34.004 34.027 34.049 34.072 34.095 34.117
34.140 34.163 34.185 34.208 34.231 34.253 34.276 34.299 34.321 34.344
34.366 34.389 34.412 34.434 34.457 34.480 34.502 34.525 34.547 34.570
34.593 34.615 34.638 34.660 34.683 34.705 34.728 34.751 34.773 34.796
34.818 34.841 34.863 34.886 34.909 34.931 34.954 34.976 34.999 35.021
35.044 35.066 35.089 35.111 35.134 35.156 35.179 35.201 35.224 35.246
35.269 35.291 35.314 35.336 35.359 35.381 35.404 35.426 35.449 35.471
35.494 35.516 35.539 35.561 35.583 35.606 35.628 35.651 35.673 35.696
35.718 35.741 35.763 35.785 35.808 35.830 35.853 35.875 35.897 35.920
35.942 35.965 35.987 36.009 36.032 36.054 36.077 36.099 36.121 36.144
36.166 36.188 36.211 36.233 36.256 36.278 36.300 36.323 36.345 36.367
36.390 36.412 36.434 36.457 36.479 36.501 36.524 36.546 36.568 36.590
36.613 36.635 36.657 36.680 36.702 36.724 36.746 36.769 36.791 36.813
36.836 36.858 36.880 36.902 36.925 36.947 36.969 36.991 37.014 37.036
37.058 37.080 37.103 37.125 37.147 37.169 37.191 37.214 37.236 37.258
37.280 37.303 37.325 37.347 37.369 37.391 37.413 37.436 37.458 37.480
37.502 37.524 37.547 37.569 37.591 37.613 37.635 37.657 37.679 37.702
37.724 37.746 37.768 37.790 37.812 37.834 37.857 37.879 37.901 37.923
37.945 37.967 37.989 38.011 38.033 38.055 38.078 38.100 38.122 38.144
38.166 38.188 38.210 38.232 38.254 38.276 38.298 38.320 38.342 38.364
38.387 38.409 38.431 38.453 38.475 38.497 38.519 38.541 38.563 38.585
38.607 38.629 38.651 38.673 38.695 38.717 38.739 38.761 38.783 38.805
38.827 38.849 38.871 38.893 38.915 38.937 38.959 38.981 39.003 39.024
39.046 39.068 39.090 39.112 39.134 39.156 39.178 39.200 39.222 39.244
39.266 39.288 39.310 39.331 39.353 39.375 39.397 39.419 39.441 39.463
39.485 39.507 39.529 39.550 39.572 39.594 39.616 39.638 39.660 39.682
39.703 39.725 39.747 39.769 39.791 39.813 39.835 39.856 39.878 39.900
39.922 39.944 39.965 39.987 40.009 40.031 40.053 40.075 40.096 40.118
40.140 40.162 40.183 40.205 40.227 40.249 40.271 40.292 40.314 40.336
40.358 40.379 40.401 40.423 40.445 40.466 40.488 40.510 40.532 40.553
40.575 40.597 40.619 40.640 40.662 40.684 40.705 40.727 40.749 40.770
40.792 40.814 40.836 40.857 40.879 40.901 40.922 40.944 40.966 40.987
41.009 41.031 41.052 41.074 41.096 41.117 41.139 41.161 41.182 41.204
41.225 41.247 41.269 41.290 41.312 41.334 41.355 41.377 41.398 41.420
41.442 41.463 41.485 41.506 41.528 41.550 41.571 41.593 41.614 41.636
41.657 41.679 41.701 41.722 41.744 41.765 41.787 41.808 41.830 41.851
41.873 41.895 41.916 41.938 41.959 41.981 42.002 42.024 42.045 42.067
42.088 42.110 42.131 42.153 42.174 42.196 42.217 42.239 42.260 42.282
42.303 42.325 42.346 42.367 42.389 42.410 42.432 42.453 42.475 42.496
42.518 42.539 42.560 42.582 42.603 42.625 42.646 42.668 42.689 42.710
42.732 42.753 42.775 42.796 42.817 42.839 42.860 42.882 42.903 42.924
42.946 42.967 42.989 43.010 43.031 43.053 43.074 43.095 43.117 43.138
43.159 43.181 43.202 43.223 43.245 43.266 43.287 43.309 43.330 43.351
43.373 43.394 43.415 43.436 43.458 43.479 43.500 43.522 43.543 43.564
43.585 43.607 43.628 43.649 43.671 43.692 43.713 43.734 43.756 43.777
43.798 43.819 43.841 43.862 43.883 43.904 43.925 43.947 43.968 43.989
44.010 44.031 44.053 44.074 44.095 44.116 44.137 44.159 44.180 44.201
44.222 44.243 44.265 44.286 44.307 44.328 44.349 44.370 44.391 44.413
44.434 44.455 44.476 44.497 44.518 44.539 44.560 44.582 44.603 44.624
44.645 44.666 44.687 44.708 44.729 44.750 44.771 44.793 44.814 44.835
44.856 44.877 44.898 44.919 44.940 44.961 44.982 45.003 45.024 45.045
45.066 45.087 45.108 45.129 45.150 45.171 45.192 45.213 45.234 45.255
45.276 45.297 45.318 45.339 45.360 45.381 45.402 45.423 45.444 45.465
45.486 45.507 45.528 45.549 45.570 45.591 45.612 45.633 45.654 45.675
45.695 45.716 45.737 45.758 45.779 45.800 45.821 45.842 45.863 45.884
45.904 45.925 45.946 45.967 45.988 46.009 46.030 46.051 46.071 46.092
46.113 46.134 46.155 46.176 46.196 46.217 46.238 46.259 46.280 46.300
46.321 46.342 46.363 46.384 46.404 46.425 46.446 46.467 46.488 46.508
46.529 46.550 46.571 46.591 46.612 46.633 46.654 46.674 46.695 46.716
46.737 46.757 46.778 46.799 46.819 46.840 46.861 46.881 46.902 46.923
46.944 46.964 46.985 47.006 47.026 47.047 47.068 47.088 47.109 47.130
47.150 47.171 47.191 47.212 47.233 47.253 47.274 47.295 47.315 47.336
47.356 47.377 47.398 47.418 47.439 47.459 47.480 47.500 47.521 47.542
47.562 47.583 47.603 47.624 47.644 47.665 47.685 47.706 47.726 47.747
47.767 47.788 47.808 47.829 47.849 47.870 47.890 47.911 47.931 47.952
47.972 47.993 48.013 48.034 48.054 48.075 48.095 48.116 48.136 48.156
48.177 48.197 48.218 48.238 48.258 48.279 48.299 48.320 48.340 48.360
48.381 48.401 48.422 48.442 48.462 48.483 48.503 48.523 48.544 48.564
48.584 48.605 48.625 48.645 48.666 48.686 48.706 48.727 48.747 48.767
48.787 48.808 48.828 48.848 48.869 48.889 48.909 48.929 48.950 48.970
48.990 49.010 49.031 49.051 49.071 49.091 49.111 49.132 49.152 49.172
49.192 49.212 49.233 49.253 49.273 49.293 49.313 49.333 49.354 49.374
49.394 49.414 49.434 49.454 49.474 49.495 49.515 49.535 49.555 49.575
49.595 49.615 49.635 49.655 49.675 49.696 49.716 49.736 49.756 49.776
49.796 49.816 49.836 49.856 49.876 49.896 49.916 49.936 49.956 49.976
49.996 50.016 50.036 50.056 50.076 50.096 50.116 50.136 50.156 50.176
50.196 50.216 50.236 50.256 50.276 50.296 50.315 50.335 50.355 50.375
50.395 50.415 50.435 50.455 50.475 50.494 50.514 50.534 50.554 50.574
50.594 50.614 50.633 50.653 50.673 50.693 50.713 50.733 50.752 50.772
50.792 50.812 50.832 50.851 50.871 50.891 50.911 50.930 50.950 50.970
50.990 51.009 51.029 51.049 51.069 51.088 51.108 51.128 51.148 51.167
51.187 51.207 51.226 51.246 51.266 51.285 51.305 51.325 51.344 51.364
51.384 51.403 51.423 51.443 51.462 51.482 51.501 51.521 51.541 51.560
51.580 51.599 51.619 51.639 51.658 51.678 51.697 51.717 51.736 51.756
51.776 51.795 51.815 51.834 51.854 51.873 51.893 51.912 51.932 51.951
51.971 51.990 52.010 52.029 52.049 52.068 52.088 52.107 52.127 52.146
52.165 52.185 52.204 52.224 52.243 52.263 52.282 52.301 52.321 52.340
52.360 52.379 52.398 52.418 52.437 52.457 52.476 52.495 52.515 52.534
52.553 52.573 52.592 52.611 52.631 52.650 52.669 52.689 52.708 52.727
52.747 52.766 52.785 52.805 52.824 52.843 52.862 52.882 52.901 52.920
52.939 52.959 52.978 52.997 53.016 53.036 53.055 53.074 53.093 53.113
53.132 53.151 53.170 53.189 53.209 53.228 53.247 53.266 53.285 53.304
53.324 53.343 53.362 53.381 53.400 53.419 53.439 53.458 53.477 53.496
53.515 53.534 53.553 53.572 53.592 53.611 53.630 53.649 53.668 53.687
53.706 53.725 53.744 53.763 53.782 53.801 53.821 53.840 53.859 53.878
53.897 53.916 53.935 53.954 53.973 53.992 54.011 54.030 54.049 54.068
54.087 54.106 54.125 54.144 54.163 54.182 54.201 54.220 54.239 54.258
54.277 54.296 54.315 54.334 54.353 54.372 54.391 54.410 54.429 54.447
54.466 54.485 54.504 54.523 54.542 54.561 54.580 54.599 54.618 54.637
54.656 54.675 54.694 54.712 54.731 54.750 54.769 54.788 54.807 54.826
54.845

View File

@@ -1,9 +1,10 @@
/* $Id$ */
/* cvtBpt.c - Convert using breakpoint table
/*
* Author: Janet Anderson
* Date: 9-19-91
*
* Author: Marty Kraimer
* Date: 04OCT95
* This is adaptation of old bldCvtTable
*
* Experimental Physics and Industrial Control System (EPICS)
*
@@ -29,63 +30,76 @@
*
* Modification Log:
* -----------------
* nnn mm-dd-yy nnn Comment
* .02 05-18-92 rcz New database access
* .03 12-11-92 mrk ANSI prototypes
* 01 04OCT95 mrk Taken from old bldCvtTable
*/
#include <vxWorks.h>
#include <types.h>
#include <stdioLib.h>
#include <stdio.h>
#include <cvtTable.h>
#include <dbAccess.h>
#include <ellLib.h>
#include <dbBase.h>
#include <dbStaticLib.h>
#include <cvtTable.h>
#include <epicsPrint.h>
extern struct dbBase *pdbBase;
extern struct dbBase *pdbbase;
#ifdef __STDC__
long cvtRawToEngBpt(double *pval,short linr,short init, void **ppbrk, short *plbrk)
#else /* __STDC__ */
long cvtRawToEngBpt(pval, linr, init, ppbrk, plbrk)
double *pval;
short linr;
short init;
void **ppbrk;
short *plbrk;
#endif /* __STDC__ */
static brkTable *findBrkTable(short linr)
{
double val=*pval;
long status=0;
struct brkTable *pbrkTable;
struct brkInt *pInt;
struct brkInt *pnxtInt;
short lbrk;
int number;
struct arrBrkTable *pcvtTable;
brkTable *pbrkTable;
dbMenu *pdbMenu;
char name[50];
char *pname = name;
int len,ind;
if(linr < 2) return(-1);
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
if( !(pcvtTable=pdbBase->pcvtTable) || (pcvtTable->number < linr)
|| (!(pcvtTable->papBrkTable[linr]))) {
errMessage(S_db_badField,"Breakpoint Table not Found");
return(S_db_badField);
}
*ppbrk = (void *)(pcvtTable->papBrkTable[linr]);
/* Just start at the beginning */
*plbrk=0;
}
pbrkTable = (struct brkTable *)*ppbrk;
number = pbrkTable->number;
lbrk = *plbrk;
/*make sure we dont go off end of table*/
if( (lbrk+1) >= number ) lbrk--;
pInt = pbrkTable->papBrkInt[lbrk];
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
/* find entry for increased value */
while( (pnxtInt->raw) <= val ) {
pdbMenu = dbFindMenu(pdbbase,"menuConvert");
len = strlen(pdbMenu->papChoiceValue[linr]);
if(len>=sizeof(name)) {
epicsPrintf("Break Tables(findBrkTable) choice name too long\n");
return(0);
}
strcpy(pname,pdbMenu->papChoiceValue[linr]);
for(ind=0; ind<strlen(pname); ind++) {
if(!isalnum(pname[ind])) {
pname[ind] = '\0';
break;
}
}
pbrkTable = dbFindBrkTable(pdbbase,pname);
return(pbrkTable);
}
long cvtRawToEngBpt(double *pval,short linr,short init, void **ppbrk,
short *plbrk)
{
double val=*pval;
long status=0;
brkTable *pbrkTable;
brkInt *pInt;
brkInt *pnxtInt;
short lbrk;
int number;
if(linr < 2) return(-1);
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
pbrkTable = findBrkTable(linr);
if(!pbrkTable) return(S_dbLib_badField);
*ppbrk = (void *)pbrkTable;
/* Just start at the beginning */
*plbrk=0;
}
pbrkTable = (struct brkTable *)*ppbrk;
number = pbrkTable->number;
lbrk = *plbrk;
/*make sure we dont go off end of table*/
if( (lbrk+1) >= number ) lbrk--;
pInt = pbrkTable->papBrkInt[lbrk];
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
/* find entry for increased value */
while( (pnxtInt->raw) <= val ) {
lbrk++;
pInt = pbrkTable->papBrkInt[lbrk];
if( lbrk >= number-1) {
@@ -93,54 +107,40 @@ short *plbrk;
break;
}
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
}
while( (pInt->raw) > val) {
}
while( (pInt->raw) > val) {
if(lbrk==0) {
status=1;
break;
}
lbrk--;
pInt = pbrkTable->papBrkInt[lbrk];
}
*plbrk = lbrk;
*pval = pInt->eng + (val - pInt->raw) * pInt->slope;
return(status);
}
*plbrk = lbrk;
*pval = pInt->eng + (val - pInt->raw) * pInt->slope;
return(status);
}
#ifdef __STDC__
long cvtEngToRawBpt(double *pval,short linr,short init,
void **ppbrk,short *plbrk)
#else /* __STDC__ */
long cvtEngToRawBpt(pval,linr, init,ppbrk,plbrk)
double *pval;
short linr;
short init;
void **ppbrk;
short *plbrk;
#endif /* __STDC__ */
{
double val=*pval;
long status=0;
struct brkTable *pbrkTable;
struct brkInt *pInt;
struct brkInt *pnxtInt;
short lbrk;
int number;
struct arrBrkTable *pcvtTable;
double val=*pval;
long status=0;
brkTable *pbrkTable;
brkInt *pInt;
brkInt *pnxtInt;
short lbrk;
int number;
if(linr < 2) return(-1);
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
if( !(pcvtTable=pdbBase->pcvtTable) || (pcvtTable->number < linr)
|| (!(pcvtTable->papBrkTable[linr]))) {
errMessage(S_db_badField,"Breakpoint Table not Found");
return(S_db_badField);
}
*ppbrk = (void *)(pcvtTable->papBrkTable[linr]);
pbrkTable = findBrkTable(linr);
if(!pbrkTable) return(S_dbLib_badField);
*ppbrk = (void *)pbrkTable;
/* Just start at the beginning */
*plbrk=0;
}
pbrkTable = (struct brkTable *)*ppbrk;
number = pbrkTable->number;
lbrk = *plbrk;

405
src/bpt/makeBpt.c Normal file
View File

@@ -0,0 +1,405 @@
/* $Id$
* Author: Marty Kraimer
* Date: 9/28/95
* Replacement for old bldCvtTable
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 28SEP95 mrk Replace old bldCvtTable
*/
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <dbBase.h>
#include <ellLib.h>
#include <cvtTable.h>
#define MAX_LINE_SIZE 160
#define MAX_BREAKS 100
struct brkCreateInfo {
float engLow; /* Lowest value desired: engineering units */
float engHigh; /* Highest value desired: engineering units */
float rawLow; /* Raw value for EngLow */
float rawHigh; /* Raw value for EngHigh */
float accuracy; /* accuracy desired in engineering units */
float tblEngFirst;/* First table value: engineering units */
float tblEngLast; /* Last table value: engineering units */
float tblEngDelta;/* Change per table entry: eng units */
long nTable; /* number of table entries */
/* (last-first)/delta + 1 */
float *pTable; /* addr of data table */
} brkCreateInfo;
brkInt brkint[MAX_BREAKS];
static int create_break(struct brkCreateInfo *pbci, brkInt *pabrkInt,
int max_breaks, int *n_breaks);
static char inbuf[MAX_LINE_SIZE];
static int linenum=0;
typedef struct dataList{
struct dataList *next;
float value;
}dataList;
static int getNumber(char **pbeg, float *value)
{
int nchars=0;
while(isspace(**pbeg) && **pbeg!= '\0') (*pbeg)++;
if(**pbeg == '!' || **pbeg == '\0') return(-1);
if(sscanf(*pbeg,"%f%n",value,&nchars)!=1) return(-1);
*pbeg += nchars;
return(0);
}
static void errExit(char *pmessage)
{
fprintf(stderr,pmessage);
fprintf(stderr,"\n");
exit(-1);
}
int main(argc, argv)
int argc;
char **argv;
{
char *pbeg;
char *pend;
float value;
char *pname;
dataList *phead;
dataList *pdataList;
dataList *pnext;
float *pdata;
long ndata;
int nBreak,len,n;
char *outFilename;
char *pext;
FILE *outFile;
FILE *inFile;
char *plastSlash;
if(argc!=2) {
fprintf(stderr,"usage: makeBpt file.data\n");
exit(-1);
}
plastSlash = strrchr(argv[1],'/');
plastSlash = (plastSlash ? plastSlash+1 : argv[1]);
outFilename = calloc(1,strlen(plastSlash)+2);
strcpy(outFilename,plastSlash);
pext = strstr(outFilename,".data");
if(!pext) {
fprintf(stderr,"Input file MUST have .data extension\n");
exit(-1);
}
strcpy(pext,".ascii");
inFile = fopen(argv[1],"r");
if(!inFile) {
fprintf(stderr,"Error opening %s\n",argv[1]);
exit(-1);
}
outFile = fopen(outFilename,"w");
if(!outFile) {
fprintf(stderr,"Error opening %s\n",outFilename);
exit(-1);
}
while(fgets(inbuf,MAX_LINE_SIZE,inFile)) {
linenum++;
inbuf[strlen(inbuf)] = '\0'; /* remove newline*/
pbeg = inbuf;
while(isspace(*pbeg) && *pbeg!= '\0') pbeg++;
if(*pbeg == '!' || *pbeg == '\0') continue;
while(*pbeg!='"' && *pbeg!= '\0') pbeg++;
if(*pbeg!='"' ) errExit("Illegal Header");
pbeg++; pend = pbeg;
while(*pend!='"' && *pend!= '\0') pend++;
if(*pend!='"') errExit("Illegal Header");
len = pend - pbeg;
if(len<=1) errExit("Illegal Header");
pname = calloc(len,sizeof(char));
strncpy(pname,pbeg,len);
pbeg = pend + 1;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.engLow = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.rawLow = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.engHigh = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.rawHigh = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.accuracy = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.tblEngFirst = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.tblEngLast = value;
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
brkCreateInfo.tblEngDelta = value;
goto got_header;
}
errExit("Illegal Header");
got_header:
phead = pnext = 0;
ndata = 0;
errno = 0;
while(fgets(inbuf,MAX_LINE_SIZE,inFile)) {
float value;
inbuf[strlen(inbuf)] = '\0'; /* remove newline*/
pbeg = inbuf;
while(!getNumber(&pbeg,&value)) {
ndata++;
pdataList = (dataList *)calloc(1,sizeof(dataList));
if(!phead)
phead = pdataList;
else
pnext->next = pdataList;
pdataList->value = value;
pnext = pdataList;
}
}
brkCreateInfo.nTable = ndata;
pdata = (float *)calloc(brkCreateInfo.nTable,sizeof(float));
pnext = phead;
for(n=0; n<brkCreateInfo.nTable; n++) {
pdata[n] = pnext->value;
pdataList = pnext;
pnext = pnext->next;
free((void *)pdataList);
}
brkCreateInfo.pTable = pdata;
if(create_break(&brkCreateInfo,&brkint[0],MAX_BREAKS,&nBreak))
errExit("create_break failed\n");
fprintf(outFile,"breaktable(%s) {\n",pname);
for(n=0; n<nBreak; n++) {
fprintf(outFile,"\t%f %f\n",brkint[n].raw,brkint[n].eng);
}
fprintf(outFile,"}\n");
fclose(inFile);
fclose(outFile);
return(0);
}
static int create_break( struct brkCreateInfo *pbci, brkInt *pabrkInt,
int max_breaks, int *n_breaks)
{
brkInt *pbrkInt;
float *table = pbci->pTable;
long ntable = pbci->nTable;
double ilow,
ihigh,
tbllow,
tblhigh,
slope,
offset;
int ibeg,
iend,
i,
inc,
imax,
n;
double rawBeg,
engBeg,
rawEnd,
engEnd,
engCalc,
engActual,
error;
int valid,
all_ok,
expanding;
/* make checks to ensure that brkCreateInfo makes sense */
if (pbci->engLow >= pbci->engHigh) {
errExit("create_break: engLow >= engHigh");
return (-1);
}
if ((pbci->engLow < pbci->tblEngFirst)
|| (pbci->engHigh > pbci->tblEngLast)) {
errExit("create_break: engLow > engHigh");
return (-1);
}
if (pbci->tblEngDelta <= 0.0) {
errExit("create_break: tblEngDelta <= 0.0");
return (-1);
}
if (ntable < 3) {
errExit("raw data must have at least 3 elements");
return (-1);
}
/***************************************************************************
Convert Table to raw values
*
* raw and table values are assumed to be related by an equation of the form:
*
* raw = slope*table + offset
*
* The following algorithm converts each table value to raw units
*
* 1) Finds the locations in Table corresponding to engLow and engHigh
* Note that these locations need not be exact integers
* 2) Interpolates to obtain table values corresponding to engLow and enghigh
* we now have the equations:
* rawLow = slope*tblLow + offset
* rawHigh = slope*tblHigh + offset
* 4) Solving these equations for slope and offset gives:
* slope=(rawHigh-rawLow)/(tblHigh-tblLow)
* offset=rawHigh-slope*tblHigh
* 5) for each table value set table[i]=table[i]*slope+offset
*************************************************************************/
/* Find engLow in Table and then compute tblLow */
ilow = (pbci->engLow - pbci->tblEngFirst) / (pbci->tblEngDelta);
i = (int) ilow;
if (i >= ntable - 1)
i = ntable - 2;
tbllow = table[i] + (table[i + 1] - table[i]) * (ilow - (float) i);
/* Find engHigh in Table and then compute tblHigh */
ihigh = (pbci->engHigh - pbci->tblEngFirst) / (pbci->tblEngDelta);
i = (int) ihigh;
if (i >= ntable - 1)
i = ntable - 2;
tblhigh = table[i] + (table[i + 1] - table[i]) * (ihigh - (float) i);
/* compute slope and offset */
slope = (pbci->rawHigh - pbci->rawLow) / (tblhigh - tbllow);
offset = pbci->rawHigh - slope * tblhigh;
/* convert table to raw units */
for (i = 0; i < ntable; i++)
table[i] = table[i] * slope + offset;
/*****************************************************************************
* Now create break point table
*
* The algorithm does the following:
*
* It finds one breakpoint interval at a time. For each it does the following:
*
* 1) Use a relatively large portion of the remaining table as an interval
* 2) It attempts to use the entire interval as a breakpoint interval
* Success is determined by the following algorithm:
* a) compute the slope using the entire interval
* b) for each table entry in the interval determine the eng value
* using the slope just determined.
* c) compare the computed value with eng value associated with table
* d) if all table entries are within the accuracy desired then success.
* 3) If successful then attempt to expand the interval and try again.
* Note that it is expanded by up to 1/10 of the table size.
* 4) If not successful reduce the interval by 1 and try again.
* Once the interval is being decreased it will never be increased again.
* 5) The algorithm will ultimately fail or will have determined the optimum
* breakpoint interval
*************************************************************************/
/* Must start with table entry corresponding to engLow; */
i = ilow;
if (i >= ntable - 1)
i = ntable - 2;
rawBeg = table[i] + (table[i + 1] - table[i]) * (ilow - (float) i);
engBeg = pbci->engLow;
ibeg = (int) (ilow); /* Make sure that ibeg > ilow */
if( ibeg < ilow ) ibeg = ibeg + 1;
/* start first breakpoint interval */
n = 1;
pbrkInt = pabrkInt;
pbrkInt->raw = rawBeg;
pbrkInt->eng = engBeg;
/* determine next breakpoint interval */
while ((engBeg <= pbci->engHigh) && (ibeg < ntable - 1)) {
/* determine next interval to try. Up to 1/10 full range */
iend = ibeg;
inc = (int) ((ihigh - ilow) / 10.0);
if (inc < 1)
inc = 1;
valid = TRUE;
/* keep trying intervals until cant do better */
expanding = TRUE; /* originally we are trying larger and larger
* intervals */
while (valid) {
imax = iend + inc;
if (imax >= ntable) {
/* don't go past end of table */
imax = ntable - 1;
inc = ntable - iend - 1;
expanding = FALSE;
}
if (imax > (int) (ihigh + 1.0)) { /* Don't go to far past
* engHigh */
imax = (int) (ihigh + 1.0);
inc = (int) (ihigh + 1.0) - iend;
expanding = FALSE;
}
if (imax <= ibeg)
break; /* failure */
rawEnd = table[imax];
engEnd = pbci->tblEngFirst + (float) imax *(pbci->tblEngDelta);
slope = (engEnd - engBeg) / (rawEnd - rawBeg);
all_ok = TRUE;
for (i = ibeg + 1; i <= imax; i++) {
engCalc = engBeg + slope * (table[i] - rawBeg);
engActual = pbci->tblEngFirst + ((float) i) * (pbci->tblEngDelta);
error = engCalc - engActual;
if (error < 0.0)
error = -error;
if (error >= pbci->accuracy) {
/* we will be trying smaller intervals */
expanding = FALSE;
/* just decrease inc and let while(valid) try again */
inc--;
all_ok = FALSE;
break;
}
} /* end for */
if (all_ok) {
iend = imax;
/* if not expanding we found interval */
if (!expanding)
break;
/* will automatically try larger interval */
}
} /* end while(valid) */
/* either we failed or optimal interval has been found */
if ((iend <= ibeg) && (iend < (int) ihigh)) {
errExit("Could not meet accuracy criteria");
return (-1);
}
pbrkInt->slope = slope;
/* get ready for next breakpoint interval */
if (n++ >= max_breaks) {
errExit("Break point table too large");
return (-1);
}
ibeg = iend;
pbrkInt++;
rawBeg = rawEnd;
engBeg = engEnd;
pbrkInt->raw = rawBeg;
pbrkInt->eng = engBeg + (pbrkInt->raw - rawBeg) * slope;
}
pbrkInt->slope = 0.0;
*n_breaks = n;
return (0);
}

16
src/bpt/menuConvert.ascii Normal file
View File

@@ -0,0 +1,16 @@
menu(menuConvert) {
choice(menuConvertNO_CONVERSION,"NO CONVERSION")
choice(menuConvertLINEAR,"LINEAR")
choice(menuConverttypeKdegF,"typeKdegF")
choice(menuConverttypeKdegC,"typeKdegC")
choice(menuConverttypeJdegF,"typeJdegF")
choice(menuConverttypeJdegC,"typeJdegC")
choice(menuConverttypeEdegF,"typeEdegF(ixe only)")
choice(menuConverttypeEdegC,"typeEdegC(ixe only)")
choice(menuConverttypeTdegF,"typeTdegF")
choice(menuConverttypeTdegC,"typeTdegC")
choice(menuConverttypeRdegF,"typeRdegF")
choice(menuConverttypeRdegC,"typeRdegC")
choice(menuConverttypeSdegF,"typeSdegF")
choice(menuConverttypeSdegC,"typeSdegC")
}

View File

@@ -5,11 +5,10 @@ $!
$! Purpose : To build the CHANNEL_ACCESS library and test programs for
$! VAX/VMS. This procedure assumes the following:
$! - You have copied *.c and *.h from the Epics channel access
$! source directory (.../src/ca) into this VMS directory
$! - You have copied envSubr.c, ellLib.c, and bucketLib.c
$! from the Epics
$! source directory (base/src/ca) into this VMS directory
$! - You have copied *.c and *.h from the Epics
$! libCom directory into this VMS directory
$! - You have copied *.h from the /src/epicsH directory into this
$! - You have copied *.h from the base/include directory into this
$! VMS directory
$! - You are using Multinet for TCP/IP access. If not, the logical
$! name definitions below will need to be changed
@@ -24,7 +23,7 @@ $!
$!========================================================================
$!
$! Example FTP script moves sources from UNIX to VMS
$! (remove "$!" comment delimeters)
$! (remove "$!" comment delimiters)
$!
$! user XXXXXXX
$! cd [.ca]
@@ -36,7 +35,9 @@ $! put BUILD_VMS.COM
$! lcd ../libCom
$! mput *.c
$! mput *.h
$! lcd ../../include
$! lcd O.sun4
$! mput envData.c
$! lcd ../../../include
$! mput *.h
$!========================================================================
$!
@@ -74,6 +75,7 @@ ENVSUBR, -
TSSUBR, -
NEXTFIELDSUBR, -
ASSERTUNIX, -
ENVDATA, -
CATIME, -
ACCTST
$ endif
@@ -97,6 +99,7 @@ BUCKETLIB, -
TSSUBR, -
ENVSUBR, -
NEXTFIELDSUBR, -
ENVDATA, -
ASSERTUNIX, -
ELLLIB
$! Link the test programs

View File

@@ -34,13 +34,7 @@ include $(EPICS)/config/RULES.Unix
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

@@ -8,21 +8,11 @@ SRCS.c = \
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c \
../catime.c
OBJS = \
LIBOBJS = \
iocinf.o access.o test_event.o service.o flow_control.o \
repeater.o conn.o syncgrp.o if_depen.o bsd_depen.o vxWorks_depen.o
PROD = caLib
LIBNAME = caLib
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

@@ -1,3 +1,4 @@
/* $Id$ */
/************************************************************************/
/* */
/* L O S A L A M O S */
@@ -92,7 +93,44 @@
/* 011394 joh fixed bucketLib level memory leak (vxWorks) */
/* 020494 joh Added user name protocol */
/* 022294 joh fixed recv task id verify at exit (vxWorks) */
/* */
/* 072895 joh fixed problem resulting from unsigned long */
/* tv_sec var in struct timeval in sys/time.h */
/* under HPUX */
/************************************************************************/
/*
* $Log$
* Revision 1.79 1995/10/12 01:30:10 jhill
* new ca_flush_io() mechanism prevents deadlock when they call
* ca_flush_io() from within an event routine. Also forces early
* transmission of leading search UDP frames.
*
* Revision 1.78 1995/09/29 21:47:33 jhill
* alignment fix for SPARC IOC client and changes to prevent running of
* access rights or connection handlers when the connection is lost just
* after deleting a channel
*
* Revision 1.77 1995/09/01 14:31:32 mrk
* Fixed bug causing memory problem
*
* Revision 1.76 1995/08/23 00:34:06 jhill
* fixed vxWorks specific SPARC data alignment problem
*
* Revision 1.75 1995/08/22 00:15:19 jhill
* Use 1.0/USEC_PER_SEC and not 1.0e-6
* Check for S_db_Pending when calling dbPutNotify()
*
* Revision 1.74 1995/08/22 00:12:07 jhill
* *** empty log message ***
*
* Revision 1.73 1995/08/14 19:26:10 jhill
* epicsAPI => epicsShareAPI
*
* Revision 1.72 1995/08/12 00:23:32 jhill
* check for res id in use, epicsEntry, dont wait for itsy bitsy delay
* in ca_pend_event(), better clean up when monitor is deleted and
* we are disconnected
*
*/
/*_begin */
/************************************************************************/
/* */
@@ -292,6 +330,22 @@ void *pext
while(TRUE){
struct timeval itimeout;
/*
* record the time if we end up blocking so that
* we can time out
*/
if (bytesAvailable>=msgsize){
piiu->sendPending = FALSE;
break;
}
else {
if (!piiu->sendPending) {
piiu->timeAtSendBlock =
ca_static->currentTime;
piiu->sendPending = TRUE;
}
}
/*
* if connection drops request
* cant be completed
@@ -311,21 +365,6 @@ void *pext
bytesAvailable = cacRingBufferWriteSize(
&piiu->send,
FALSE);
/*
* record the time if we end up blocking so that
* we can time out
*/
if (bytesAvailable>=extsize+sizeof(msg)) {
piiu->sendPending = FALSE;
break;
}
else {
if (!piiu->sendPending) {
piiu->timeAtSendBlock =
ca_static->currentTime;
piiu->sendPending = TRUE;
}
}
}
}
@@ -443,7 +482,7 @@ LOCAL void cac_add_msg (IIU *piiu)
/*
* CA_TASK_INITIALIZE
*/
int APIENTRY ca_task_initialize(void)
int epicsShareAPI ca_task_initialize(void)
{
int status;
struct ca_static *ca_temp;
@@ -548,6 +587,8 @@ int ca_os_independent_init (void)
ca_spawn_repeater();
}
ca_static->ca_flush_pending = FALSE;
return ECA_NORMAL;
}
@@ -566,6 +607,7 @@ LOCAL void create_udp_fd()
status = create_net_chan(
&ca_static->ca_piiuCast,
NULL,
ca_static->ca_server_port,
IPPROTO_UDP);
if (~status & CA_M_SUCCESS) {
ca_static->ca_piiuCast = NULL;
@@ -589,7 +631,7 @@ LOCAL void create_udp_fd()
status = taskSpawn(
name,
pri-1,
pri+1,
VX_FP_TASK,
4096,
(FUNCPTR)cac_recv_task,
@@ -620,7 +662,7 @@ LOCAL void create_udp_fd()
* Modify or override the default
* client host name.
*/
int APIENTRY ca_modify_host_name(char *pHostName)
int epicsShareAPI ca_modify_host_name(char *pHostName)
{
char *pTmp;
unsigned size;
@@ -675,7 +717,7 @@ int APIENTRY ca_modify_host_name(char *pHostName)
* Modify or override the default
* client user name.
*/
int APIENTRY ca_modify_user_name(char *pClientName)
int epicsShareAPI ca_modify_user_name(char *pClientName)
{
char *pTmp;
unsigned size;
@@ -730,7 +772,7 @@ int APIENTRY ca_modify_user_name(char *pClientName)
* call this routine if you wish to free resources prior to task
* exit- ca_task_exit() is also executed routinely at task exit.
*/
int APIENTRY ca_task_exit (void)
int epicsShareAPI ca_task_exit (void)
{
/*
* This indirectly calls ca_process_exit() below
@@ -858,10 +900,10 @@ void ca_process_exit()
/*
* free hash tables
*/
status = bucketFree(ca_static->ca_pSlowBucket);
assert(status == BUCKET_SUCCESS);
status = bucketFree(ca_static->ca_pFastBucket);
assert(status == BUCKET_SUCCESS);
status = bucketFree (ca_static->ca_pSlowBucket);
assert (status == S_bucket_success);
status = bucketFree (ca_static->ca_pFastBucket);
assert (status == S_bucket_success);
/*
* free beacon hash table
@@ -880,7 +922,7 @@ void ca_process_exit()
*
* backwards compatible entry point to ca_search_and_connect()
*/
int APIENTRY ca_build_and_connect
int epicsShareAPI ca_build_and_connect
(
char *name_str,
chtype get_type,
@@ -905,7 +947,7 @@ int APIENTRY ca_build_and_connect
*
*
*/
int APIENTRY ca_search_and_connect
int epicsShareAPI ca_search_and_connect
(
char *name_str,
chid *chixptr,
@@ -950,13 +992,14 @@ int APIENTRY ca_search_and_connect
* also allocate enough for the channel name & paddr
* block
*/
size = sizeof(*chix) + strcnt + sizeof(struct db_addr);
size = CA_MESSAGE_ALIGN(sizeof(*chix) + strcnt) +
sizeof(struct db_addr);
*chixptr = chix = (chid) calloc(1,size);
if (!chix){
return ECA_ALLOCMEM;
}
chix->id.paddr = (struct db_addr *)
(strcnt + (char *) (chix + 1));
(CA_MESSAGE_ALIGN(sizeof(*chix)+strcnt) + (char *)chix);
*chix->id.paddr = tmp_paddr;
chix->puser = puser;
chix->pConnFunc = conn_func;
@@ -1010,13 +1053,20 @@ int APIENTRY ca_search_and_connect
}
LOCK;
chix->cid = CLIENT_SLOW_ID_ALLOC;
status = bucketAddItemUnsignedId(pSlowBucket, &chix->cid, chix);
if(status != BUCKET_SUCCESS){
do {
chix->cid = CLIENT_SLOW_ID_ALLOC;
status = bucketAddItemUnsignedId (pSlowBucket,
&chix->cid, chix);
} while (status == S_bucket_idInUse);
if (status != S_bucket_success) {
*chixptr = (chid) NULL;
free((char *) chix);
UNLOCK;
return ECA_ALLOCMEM;
if (status == S_bucket_noMemory) {
return ECA_ALLOCMEM;
}
return ECA_INTERNAL;
}
chix->puser = puser;
@@ -1127,7 +1177,7 @@ int reply_type
*
*
*/
int APIENTRY ca_array_get
int epicsShareAPI ca_array_get
(
chtype type,
unsigned long count,
@@ -1195,8 +1245,10 @@ void *pvalue
}
else {
LOCK;
ellDelete (&pend_read_list, &monix->node);
caIOBlockFree (monix);
if (ca_state(chix)==cs_conn) {
ellDelete (&pend_read_list, &monix->node);
caIOBlockFree (monix);
}
UNLOCK;
}
}
@@ -1212,7 +1264,7 @@ void *pvalue
/*
* CA_ARRAY_GET_CALLBACK()
*/
int APIENTRY ca_array_get_callback
int epicsShareAPI ca_array_get_callback
(
chtype type,
unsigned long count,
@@ -1273,8 +1325,10 @@ void *arg
status = issue_get_callback (monix, IOC_READ_NOTIFY);
if (status != ECA_NORMAL) {
LOCK;
ellDelete (&pend_read_list, &monix->node);
caIOBlockFree (monix);
if (ca_state(chix)==cs_conn) {
ellDelete (&pend_read_list, &monix->node);
caIOBlockFree (monix);
}
UNLOCK;
}
}
@@ -1305,12 +1359,15 @@ LOCAL evid caIOBlockCreate(void)
}
if (pIOBlock) {
pIOBlock->id = CLIENT_FAST_ID_ALLOC;
status = bucketAddItemUnsignedId(
pFastBucket,
&pIOBlock->id,
pIOBlock);
if(status != BUCKET_SUCCESS){
do {
pIOBlock->id = CLIENT_FAST_ID_ALLOC;
status = bucketAddItemUnsignedId(
pFastBucket,
&pIOBlock->id,
pIOBlock);
} while (status == S_bucket_idInUse);
if(status != S_bucket_success){
free(pIOBlock);
pIOBlock = NULL;
}
@@ -1333,7 +1390,7 @@ void caIOBlockFree(evid pIOBlock)
status = bucketRemoveItemUnsignedId(
ca_static->ca_pFastBucket,
&pIOBlock->id);
assert (status == BUCKET_SUCCESS);
assert (status == S_bucket_success);
pIOBlock->id = ~0U; /* this id always invalid */
ellAdd (&free_event_list, &pIOBlock->node);
UNLOCK;
@@ -1433,7 +1490,7 @@ LOCAL int issue_get_callback(evid monix, unsigned cmmd)
* CA_ARRAY_PUT_CALLBACK()
*
*/
int APIENTRY ca_array_put_callback
int epicsShareAPI ca_array_put_callback
(
chtype type,
unsigned long count,
@@ -1537,7 +1594,7 @@ void *usrarg
}
status = dbPutNotify(&ppn->dbPutNotify);
UNLOCK;
if(status){
if(status && status != S_db_Pending){
if(status==S_db_Blocked){
return ECA_PUTCBINPROG;
}
@@ -1577,8 +1634,10 @@ void *usrarg
pvalue);
if(status != ECA_NORMAL){
LOCK;
ellDelete (&pend_write_list, &monix->node);
caIOBlockFree(monix);
if (ca_state(chix)==cs_conn) {
ellDelete (&pend_write_list, &monix->node);
caIOBlockFree(monix);
}
UNLOCK;
return status;
}
@@ -1642,7 +1701,7 @@ LOCAL void ca_put_notify_action(PUTNOTIFY *ppn)
*
*
*/
int APIENTRY ca_array_put (
int epicsShareAPI ca_array_put (
chtype type,
unsigned long count,
chid chix,
@@ -1883,7 +1942,7 @@ LOCAL void free_put_convert(void *pBuf)
* Specify an event subroutine to be run for connection events
*
*/
int APIENTRY ca_change_connection_event
int epicsShareAPI ca_change_connection_event
(
chid chix,
void (*pfunc)(struct connection_handler_args)
@@ -1915,7 +1974,7 @@ void (*pfunc)(struct connection_handler_args)
/*
* ca_replace_access_rights_event
*/
int APIENTRY ca_replace_access_rights_event(
int epicsShareAPI ca_replace_access_rights_event(
chid chan,
void (*pfunc)(struct access_rights_handler_args))
{
@@ -1929,7 +1988,7 @@ void (*pfunc)(struct access_rights_handler_args))
/*
* make certain that it runs at least once
*/
if(chan->state == cs_conn){
if(chan->state == cs_conn && chan->pAccessRightsFunc){
args.chid = chan;
args.ar = chan->ar;
(*chan->pAccessRightsFunc)(args);
@@ -1943,7 +2002,7 @@ void (*pfunc)(struct access_rights_handler_args))
* Specify an event subroutine to be run for asynch exceptions
*
*/
int APIENTRY ca_add_exception_event
int epicsShareAPI ca_add_exception_event
(
void (*pfunc)(struct exception_handler_args),
void *arg
@@ -1975,7 +2034,7 @@ void *arg
* Undocumented entry for the VAX OPI which may vanish in the future.
*
*/
int APIENTRY ca_add_io_event
int epicsShareAPI ca_add_io_event
(
void (*ast)(),
void *astarg
@@ -2010,7 +2069,7 @@ void *astarg
*
*
*/
int APIENTRY ca_add_masked_array_event
int epicsShareAPI ca_add_masked_array_event
(
chtype type,
unsigned long count,
@@ -2140,8 +2199,10 @@ long mask
status = ca_request_event(monix);
if (status != ECA_NORMAL) {
LOCK;
ellDelete (&chix->eventq, &monix->node);
caIOBlockFree(monix);
if (ca_state(chix)==cs_conn) {
ellDelete (&chix->eventq, &monix->node);
caIOBlockFree(monix);
}
UNLOCK
}
return status;
@@ -2373,7 +2434,7 @@ void *pfl
* after leaving this routine.
*
*/
int APIENTRY ca_clear_event (evid monix)
int epicsShareAPI ca_clear_event (evid monix)
{
int status;
chid chix = monix->chan;
@@ -2448,6 +2509,7 @@ int APIENTRY ca_clear_event (evid monix)
else{
LOCK;
ellDelete(&monix->chan->eventq, &monix->node);
caIOBlockFree(monix);
UNLOCK;
status = ECA_NORMAL;
}
@@ -2471,7 +2533,7 @@ int APIENTRY ca_clear_event (evid monix)
* (from this source) after leaving this routine.
*
*/
int APIENTRY ca_clear_channel (chid chix)
int epicsShareAPI ca_clear_channel (chid chix)
{
int status;
evid monix;
@@ -2485,6 +2547,8 @@ int APIENTRY ca_clear_channel (chid chix)
chix->type = TYPENOTINUSE;
old_chan_state = chix->state;
chix->state = cs_closed;
chix->pAccessRightsFunc = NULL;
chix->pConnFunc = NULL;
/* the while is only so I can break to the lock exit */
LOCK;
@@ -2614,7 +2678,7 @@ void clearChannelResources(unsigned id)
ellDelete (&piiu->chidlist, &chix->node);
status = bucketRemoveItemUnsignedId (
ca_static->ca_pSlowBucket, &chix->cid);
assert (status == BUCKET_SUCCESS);
assert (status == S_bucket_success);
free (chix);
if (piiu!=piiuCast && !piiu->chidlist.count){
TAG_CONN_DOWN(piiu);
@@ -2631,48 +2695,59 @@ void clearChannelResources(unsigned id)
/* if the argument early is specified TRUE then CA_NORMAL is */
/* returned early (prior to timeout experation) when outstanding */
/* IO completes. */
/* ca_flush_io() is called by this routine. */
/* Output buffers are flushed by this routine */
/************************************************************************/
int APIENTRY ca_pend(ca_real timeout, int early)
int epicsShareAPI ca_pend (ca_real timeout, int early)
{
struct timeval beg_time;
ca_real delay;
struct timeval tmo;
INITCHK;
if(timeout<0.0){
return ECA_TIMEOUT;
}
if(EVENTLOCKTEST){
return ECA_EVDISALLOW;
}
cac_gettimeval (&ca_static->currentTime);
/*
* Flush the send buffers
* (guarantees that we wait for all send buffer to be
* flushed even if this requires blocking)
*
* Also takes care of outstanding recvs
* for single threaded clients
*/
ca_flush_io();
ca_static->ca_flush_pending = TRUE;
if(pndrecvcnt<1 && early){
/*
* force the flush
*/
LD_CA_TIME (0.0, &tmo);
cac_mux_io(&tmo);
return ECA_NORMAL;
}
/*
* the current time set iderectly within ca_flush_io()
* above.
*/
if(timeout<0.0){
/*
* force the flush
*/
LD_CA_TIME (0.0, &tmo);
cac_mux_io(&tmo);
return ECA_TIMEOUT;
}
beg_time = ca_static->currentTime;
delay = 0.0;
while(TRUE){
ca_real remaining;
struct timeval tmo;
if (pndrecvcnt<1 && early) {
/*
* force the flush
*/
LD_CA_TIME (0.0, &tmo);
cac_mux_io(&tmo);
return ECA_NORMAL;
}
@@ -2681,29 +2756,48 @@ int APIENTRY ca_pend(ca_real timeout, int early)
}
else{
remaining = timeout-delay;
if(remaining<=0.0){
if(early){
ca_pend_io_cleanup();
}
ca_flush_io();
return ECA_TIMEOUT;
}
/*
* Allow for CA background labor
*/
remaining = min(SELECT_POLL, remaining);
}
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 we are no longer waiting any significant
* delay then return
* (dont wait forever for an itsy bitsy
* delay which will no be updated if
* select is called with no delay)
*
* current time is only updated by
* cac_select_io() if we specify
* at least 1 usec to wait
*
*/
if (remaining <= (1.0/USEC_PER_SEC)) {
if(early){
ca_pend_io_cleanup();
ca_static->ca_flush_pending = TRUE;
}
/*
* be certain that we processed
* recv backlog at least once
*/
/*
* force the flush
*/
LD_CA_TIME (0.0, &tmo);
cac_block_for_io_completion (&tmo);
return ECA_TIMEOUT;
}
tmo.tv_sec = (long) remaining;
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
cac_block_for_io_completion (&tmo);
if (timeout != 0.0) {
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
delay = cac_time_diff (&ca_static->currentTime,
&beg_time);
}
}
}
@@ -2714,20 +2808,31 @@ int APIENTRY ca_pend(ca_real timeout, int early)
*/
ca_real cac_time_diff (ca_time *pTVA, ca_time *pTVB)
{
ca_real delay;
ca_real delay;
ca_real udelay;
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 = pTVA->tv_sec - pTVB->tv_sec - 1L;
delay += (USEC_PER_SEC - pTVB->tv_usec + pTVA->tv_usec) /
(ca_real)(USEC_PER_SEC);
}
/*
* works with unsigned tv_sec in struct timeval
* under HPUX
*/
if (pTVA->tv_sec>pTVB->tv_sec) {
delay = pTVA->tv_sec - pTVB->tv_sec;
}
else {
delay = pTVB->tv_sec - pTVA->tv_sec;
delay = -delay;
}
return delay;
if(pTVA->tv_usec>pTVB->tv_usec){
udelay = pTVA->tv_usec - pTVB->tv_usec;
}
else{
delay -= 1.0;
udelay = (USEC_PER_SEC - pTVB->tv_usec) + pTVA->tv_usec;
}
delay += udelay / USEC_PER_SEC;
return delay;
}
@@ -2790,55 +2895,27 @@ LOCAL void ca_pend_io_cleanup()
/*
* CA_FLUSH_IO()
*
* Flush the send buffer
*
* reprocess connection state and
* flush the send buffer
*/
int APIENTRY ca_flush_io()
int epicsShareAPI ca_flush_io()
{
struct ioc_in_use *piiu;
struct timeval timeout;
int pending;
unsigned long bytesPending;
INITCHK;
pending = TRUE;
timeout.tv_usec = 0;
timeout.tv_sec = 0;
while(pending){
/*
* force early transmission of the first few search frames
*/
manage_conn(TRUE);
/*
* perform socket io
* and process recv backlog
*/
cac_mux_io(&timeout);
/*
* wait for all buffers to flush
*/
pending = FALSE;
LOCK;
for( piiu = (IIU *) iiuList.node.next;
piiu;
piiu = (IIU *) piiu->node.next){
if(piiu == piiuCast || piiu->conn_up == FALSE){
continue;
}
bytesPending = cacRingBufferReadSize(
&piiu->send,
FALSE);
if(bytesPending != 0){
pending = TRUE;
}
}
UNLOCK;
LD_CA_TIME (SELECT_POLL, &timeout);
}
/*
* Wait for all send buffers to be flushed
* while performing socket io and processing recv backlog
*/
ca_static->ca_flush_pending = TRUE;
LD_CA_TIME (0.0, &timeout);
cac_mux_io (&timeout);
return ECA_NORMAL;
}
@@ -2848,7 +2925,7 @@ int APIENTRY ca_flush_io()
* CA_TEST_IO ()
*
*/
int APIENTRY ca_test_io()
int epicsShareAPI ca_test_io()
{
if(pndrecvcnt<1){
return ECA_IODONE;
@@ -2864,7 +2941,7 @@ int APIENTRY ca_test_io()
*
*
*/
void APIENTRY ca_signal(long ca_status,char *message)
void epicsShareAPI ca_signal(long ca_status,char *message)
{
ca_signal_with_file_and_lineno(ca_status, message, NULL, 0);
}
@@ -2873,7 +2950,7 @@ void APIENTRY ca_signal(long ca_status,char *message)
/*
* ca_signal_with_file_and_lineno()
*/
void APIENTRY ca_signal_with_file_and_lineno(
void epicsShareAPI ca_signal_with_file_and_lineno(
long ca_status,
char *message,
char *pfilenm,
@@ -3236,7 +3313,7 @@ LOCAL void ca_default_exception_handler(struct exception_handler_args args)
* (for a manager of the select system call under UNIX)
*
*/
int APIENTRY ca_add_fd_registration(CAFDHANDLER *func, void *arg)
int epicsShareAPI ca_add_fd_registration(CAFDHANDLER *func, void *arg)
{
fd_register_func = func;
fd_register_arg = arg;
@@ -3267,7 +3344,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 * epicsShareAPI ca_host_name_function(chid chix)
{
IIU *piiu;
@@ -3283,7 +3360,7 @@ char * APIENTRY ca_host_name_function(chid chix)
/*
* ca_v42_ok(chid chan)
*/
int APIENTRY ca_v42_ok(chid chan)
int epicsShareAPI ca_v42_ok(chid chan)
{
int v42;
IIU *piiu;
@@ -3360,10 +3437,12 @@ int ca_channel_status(int tid)
/*
* ca_replace_printf_handler ()
*/
int APIENTRY ca_replace_printf_handler (
int epicsShareAPI ca_replace_printf_handler (
int (*ca_printf_func)(const char *pformat, va_list args)
)
{
INITCHK;
if (ca_printf_func) {
ca_static->ca_printf_func = ca_printf_func;
}

View File

@@ -5,6 +5,19 @@
static char *sccsId = "@(#) $Id$";
/*
* $Log$
* Revision 1.31 1995/10/12 01:30:28 jhill
* improved the test
*
* Revision 1.30 1995/09/29 21:47:58 jhill
* MS windows changes
*
* Revision 1.29 1995/08/22 00:16:34 jhill
* Added test of the duration of ca_pend_event()
*
*/
#ifdef VMS
#include <LIB$ROUTINES.H>
#endif
@@ -19,7 +32,7 @@ static char *sccsId = "@(#) $Id$";
#include "os_depen.h"
#include <epicsAssert.h>
#include <assert.h>
#include <cadef.h>
#define EVENT_ROUTINE null_event
@@ -27,7 +40,11 @@ static char *sccsId = "@(#) $Id$";
#define NUM 1
int conn_get_cb_count;
int conn_cb_count;
#ifndef min
#define min(A,B) ((A)>(B)?(B):(A))
#endif
int doacctst(char *pname);
void test_sync_groups(chid chix);
@@ -35,9 +52,22 @@ void multiple_sg_requests(chid chix, CA_SYNC_GID gid);
void null_event(struct event_handler_args args);
void write_event(struct event_handler_args args);
void conn(struct connection_handler_args args);
void conn_cb(struct event_handler_args args);
void get_cb(struct event_handler_args args);
void accessSecurity_cb(struct access_rights_handler_args args);
void doubleTest(
chid chan,
dbr_double_t beginValue,
dbr_double_t increment,
dbr_double_t epsilon,
unsigned iterations);
void floatTest(
chid chan,
dbr_float_t beginValue,
dbr_float_t increment,
dbr_float_t epsilon,
unsigned iterations);
#ifdef vxWorks
int acctst(char *pname)
@@ -82,25 +112,45 @@ int doacctst(char *pname)
chid chix4;
struct dbr_gr_float *ptr = NULL;
struct dbr_gr_float *pgrfloat = NULL;
float *pfloat = NULL;
double *pdouble = NULL;
dbr_float_t *pfloat = NULL;
dbr_double_t *pdouble = NULL;
long status;
long i, j;
evid monix;
char pstring[NUM][MAX_STRING_SIZE];
unsigned size;
SEVCHK(ca_task_initialize(), "Unable to initialize");
conn_get_cb_count = 0;
conn_cb_count = 0;
printf("begin\n");
#ifdef VMS
lib$init_timer();
#endif /*VMS*/
ptr = (struct dbr_gr_float *)
malloc(dbr_size_n(DBR_GR_FLOAT, NUM));
{
TS_STAMP end_time;
TS_STAMP start_time;
dbr_double_t delay;
dbr_double_t request = 0.5;
dbr_double_t accuracy;
tsLocalTime(&start_time);
status = ca_pend_event(request);
if (status != ECA_TIMEOUT) {
SEVCHK(status, NULL);
}
tsLocalTime(&end_time);
TsDiffAsDouble(&delay,&end_time,&start_time);
accuracy = 100.0*(delay-request)/request;
printf("CA pend event delay accuracy = %f %%\n",
accuracy);
assert (abs(accuracy) < 10.0);
}
size = dbr_size_n(DBR_GR_FLOAT, NUM);
ptr = (struct dbr_gr_float *) malloc(size);
for (i = 0; i < 10; i++) {
@@ -213,41 +263,81 @@ int doacctst(char *pname)
ca_read_access(chix1),
ca_write_access(chix1));
#if 0
/*
* Verify that we can write and then read back
* the same value
* the same analog value
*/
if( (ca_field_type(chix1)==DBR_FLOAT ||
ca_field_type(chix1)==DBR_DOUBLE) &&
ca_read_access(chix1) &&
ca_write_access(chix1)){
double dval = 3.3;
float fval = -8893.3;
double dret = DBL_MAX;
float fret = FLT_MAX;
dbr_double_t incr;
dbr_double_t epsil;
dbr_double_t base;
unsigned long iter;
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( fabs(dval-dret) < DBL_EPSILON*4);
printf ("float test ...");
fflush(stdout);
epsil = FLT_EPSILON*4;
base = FLT_MIN;
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
incr = ldexp (0.5,i);
iter = FLT_MAX/fabs(incr);
iter = min (iter,10);
floatTest(chix1, base, incr, epsil, iter);
}
base = FLT_MAX;
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
incr = - ldexp (0.5,i);
iter = FLT_MAX/fabs(incr);
iter = min (iter,10);
floatTest(chix1, base, incr, epsil, iter);
}
base = - FLT_MAX;
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
incr = ldexp (0.5,i);
iter = FLT_MAX/fabs(incr);
iter = min (iter,10);
floatTest(chix1, base, incr, epsil, iter);
}
printf ("done\n");
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( fabs(fval-fret) < FLT_EPSILON*4);
printf ("double test ...");
fflush(stdout);
epsil = DBL_EPSILON*4;
base = DBL_MIN;
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
incr = ldexp (0.5,i);
iter = DBL_MAX/fabs(incr);
iter = min (iter,10);
doubleTest(chix1, base, incr, epsil, iter);
}
base = DBL_MAX;
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
incr = - ldexp (0.5,i);
iter = DBL_MAX/fabs(incr);
iter = min (iter,10);
doubleTest(chix1, base, incr, epsil, iter);
}
base = - DBL_MAX;
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
incr = ldexp (0.5,i);
iter = DBL_MAX/fabs(incr);
iter = min (iter,10);
doubleTest(chix1, base, incr, epsil, iter);
}
printf ("done\n");
}
#endif
/*
* verify we dont jam up on many uninterrupted
* solicitations
*/
if(ca_read_access(chix4)){
float temp;
dbr_float_t temp;
printf("Performing multiple get test...");
fflush(stdout);
@@ -268,7 +358,7 @@ int doacctst(char *pname)
printf("Performing multiple put test...");
fflush(stdout);
for(i=0; i<10000; i++){
double fval = 3.3;
dbr_double_t fval = 3.3;
status = ca_put(DBR_DOUBLE, chix4, &fval);
SEVCHK(status, NULL);
}
@@ -315,7 +405,7 @@ int doacctst(char *pname)
printf("Performing multiple put callback test...");
fflush(stdout);
for(i=0; i<10000; i++){
float fval = 3.3;
dbr_float_t fval = 3.3F;
status = ca_array_put_callback(
DBR_FLOAT,
1,
@@ -339,8 +429,8 @@ int doacctst(char *pname)
printf("Performing multiple monitor test...");
fflush(stdout);
{
evid mid[1000];
float temp;
evid mid[1000];
dbr_float_t temp;
for(i=0; i<NELEMENTS(mid); i++){
SEVCHK(ca_add_event(DBR_GR_FLOAT, chix4, null_event,
@@ -418,8 +508,8 @@ int doacctst(char *pname)
SEVCHK(status, NULL);
}
pfloat = (float *) calloc(sizeof(float),NUM);
pdouble = (double *) calloc(sizeof(double),NUM);
pfloat = (dbr_float_t *) calloc(sizeof(*pfloat),NUM);
pdouble = (dbr_double_t *) calloc(sizeof(*pdouble),NUM);
pgrfloat = (struct dbr_gr_float *) calloc(sizeof(*pgrfloat),NUM);
if (VALID_DB_REQ(chix1->type))
@@ -475,15 +565,44 @@ int doacctst(char *pname)
SEVCHK(ca_modify_user_name("Willma"), NULL);
SEVCHK(ca_modify_host_name("Bed Rock"), NULL);
if (conn_get_cb_count != 3){
if (conn_cb_count != 3){
printf ("!!!! Connect cb count = %d expected = 3 !!!!\n",
conn_get_cb_count);
conn_cb_count);
}
printf("-- Put/Gets done- waiting for Events --\n");
status = ca_pend_event(10.0);
if (status != ECA_TIMEOUT) {
SEVCHK(status, NULL);
{
TS_STAMP end_time;
TS_STAMP start_time;
dbr_double_t delay;
dbr_double_t request = 15.0;
dbr_double_t accuracy;
tsLocalTime(&start_time);
printf("waiting for events for %f sec\n", request);
status = ca_pend_event(request);
if (status != ECA_TIMEOUT) {
SEVCHK(status, NULL);
}
tsLocalTime(&end_time);
TsDiffAsDouble(&delay,&end_time,&start_time);
accuracy = 100.0*(delay-request)/request;
printf("CA pend event delay accuracy = %f %%\n",
accuracy);
assert (abs(accuracy) < 10.0);
}
{
TS_STAMP end_time;
TS_STAMP start_time;
dbr_double_t delay;
tsLocalTime(&start_time);
printf("entering ca_task_exit()\n");
status = ca_task_exit();
SEVCHK(status,NULL);
tsLocalTime(&end_time);
TsDiffAsDouble(&delay,&end_time,&start_time);
printf("in ca_task_exit() for %f sec\n", delay);
}
if (ptr){
@@ -499,17 +618,73 @@ int doacctst(char *pname)
free(pgrfloat);
}
status = ca_task_exit();
SEVCHK(status,NULL);
return(0);
}
void floatTest(
chid chan,
dbr_float_t beginValue,
dbr_float_t increment,
dbr_float_t epsilon,
unsigned iterations)
{
unsigned i;
dbr_float_t fval;
dbr_float_t fretval;
int status;
fval = beginValue;
for (i=0; i<iterations; i++) {
fretval = FLT_MAX;
status = ca_put (DBR_FLOAT, chan, &fval);
SEVCHK (status, NULL);
status = ca_get (DBR_FLOAT, chan, &fretval);
SEVCHK (status, NULL);
status = ca_pend_io (100.0);
SEVCHK (status, NULL);
assert (fabs(fval-fretval) < epsilon);
fval += increment;
}
}
void doubleTest(
chid chan,
dbr_double_t beginValue,
dbr_double_t increment,
dbr_double_t epsilon,
unsigned iterations)
{
unsigned i;
dbr_double_t fval;
dbr_double_t fretval;
int status;
fval = beginValue;
for (i=0; i<iterations; i++) {
fretval = DBL_MAX;
status = ca_put (DBR_DOUBLE, chan, &fval);
SEVCHK (status, NULL);
status = ca_get (DBR_DOUBLE, chan, &fretval);
SEVCHK (status, NULL);
status = ca_pend_io (100.0);
SEVCHK (status, NULL);
assert (fabs(fval-fretval) < epsilon);
fval += increment;
}
}
void null_event(struct event_handler_args args)
{
static int i;
dbr_double_t fval = 3.8;
int status;
#if 0
status = ca_put (DBR_DOUBLE, args.chid, &fval);
SEVCHK (status, NULL);
#endif
if (i++ > 1000) {
printf("1000 occurred\n");
@@ -521,9 +696,15 @@ void null_event(struct event_handler_args args)
void write_event(struct event_handler_args args)
{
int status;
float a = *(float *) args.dbr;
dbr_float_t *pFloat = (dbr_float_t *) args.dbr;
dbr_float_t a;
a += 10.1;
if (!args.dbr) {
return;
}
a = *pFloat;
a += 10.1F;
status = ca_array_put(
DBR_FLOAT,
@@ -544,15 +725,15 @@ void conn(struct connection_handler_args args)
else
printf("Ukn conn ev\n");
ca_get_callback(DBR_GR_FLOAT, args.chid, conn_cb, NULL);
ca_get_callback(DBR_GR_FLOAT, args.chid, get_cb, NULL);
}
void conn_cb(struct event_handler_args args)
void get_cb(struct event_handler_args args)
{
if(!(args.status & CA_M_SUCCESS)){
printf("Get cb failed because \"%s\"\n", ca_message(args.status));
}
conn_get_cb_count++;
conn_cb_count++;
}
@@ -612,10 +793,10 @@ void test_sync_groups(chid chix)
*/
void multiple_sg_requests(chid chix, CA_SYNC_GID gid)
{
int status;
unsigned i;
static float fvalput = 3.3;
static float fvalget;
int status;
unsigned i;
static dbr_float_t fvalput = 3.3F;
static dbr_float_t fvalget;
for(i=0; i<1000; i++){
if(ca_write_access(chix)){

View File

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

View File

@@ -115,7 +115,13 @@ int cac_select_io(struct timeval *ptimeout, int flags)
&autoTimeOut);
# endif
cac_gettimeval (&ca_static->currentTime);
/*
* get a new time stamp if we have been waiting
* for any significant length of time
*/
if (ptimeout->tv_sec || ptimeout->tv_usec) {
cac_gettimeval (&ca_static->currentTime);
}
if (status<0) {
if (MYERRNO == EINTR) {

View File

@@ -59,6 +59,7 @@ LOCAL void test (
unsigned iterations
);
LOCAL tf test_pend;
LOCAL tf test_search;
LOCAL tf test_free;
LOCAL tf test_wait;
@@ -82,7 +83,7 @@ int main(int argc, char **argv)
catime(pname);
}
else{
printf("usage: %s <channel name>", argv[0]);
printf("usage: %s <channel name>\n", argv[0]);
return -1;
}
return 0;
@@ -119,6 +120,9 @@ int catime (char *channelName)
ca_field_type(itemList[0].chix),
ca_element_count(itemList[0].chix));
printf ("\tpend event test\n");
timeIt (test_pend, NULL, 100);
for (i=0; i<NELEMENTS(itemList); i++) {
itemList[i].val.fltval = 0.0;
itemList[i].type = DBR_FLOAT;
@@ -183,14 +187,56 @@ void timeIt(
unsigned inlineIter;
status = tsLocalTime(&start_time);
#if 0
assert (status == S_ts_OK);
#endif
(*pfunc) (pItems, iterations, &inlineIter);
status = tsLocalTime(&end_time);
#if 0
assert (status == S_ts_OK);
#endif
TsDiffAsDouble(&delay,&end_time,&start_time);
printf ("Elapsed Per Item = %f\n", delay/(iterations*inlineIter));
}
/*
* test_search ()
*/
LOCAL void test_pend(
ti *pItems,
unsigned iterations,
unsigned *pInlineIter
)
{
unsigned i;
int status;
for (i=0; i<iterations; i++) {
status = ca_pend_event(1e-9);
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
SEVCHK(status, NULL);
}
status = ca_pend_event(1e-9);
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
SEVCHK(status, NULL);
}
status = ca_pend_event(1e-9);
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
SEVCHK(status, NULL);
}
status = ca_pend_event(1e-9);
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
SEVCHK(status, NULL);
}
status = ca_pend_event(1e-9);
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
SEVCHK(status, NULL);
}
}
*pInlineIter = 5;
}
/*
* test_search ()

View File

@@ -1,5 +1,6 @@
/* $Id$ */
/************************************************************************/
/* */
/* */
/* L O S A L A M O S */
/* Los Alamos National Laboratory */
/* Los Alamos, New Mexico 87545 */
@@ -28,6 +29,7 @@
/* .12 110194 joh improved search scheduling */
/* (dont send all chans in a block) */
/* */
/* $Log$ */
/*_begin */
/************************************************************************/
/* */
@@ -349,7 +351,7 @@ LOCAL void logRetryInterval(char *pFN, unsigned lineno)
/*
* MARK_SERVER_AVAILABLE
*/
void mark_server_available(struct in_addr *pnet_addr)
void mark_server_available(const struct in_addr *pnet_addr)
{
chid chan;
ca_real currentPeriod;
@@ -502,7 +504,7 @@ void mark_server_available(struct in_addr *pnet_addr)
*
* LOCK must be applied
*/
bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
bhe *createBeaconHashEntry(const struct in_addr *pnet_addr)
{
bhe *pBHE;
unsigned index;
@@ -535,7 +537,7 @@ bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
* start the average at zero
*/
pBHE->averagePeriod = 0.0;
cac_gettimeval(&pBHE->timeStamp);
pBHE->timeStamp = ca_static->currentTime;
/*
* install in the hash table
@@ -552,7 +554,7 @@ bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
*
* LOCK must be applied
*/
bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr)
bhe *lookupBeaconInetAddr (const struct in_addr *pnet_addr)
{
bhe *pBHE;
unsigned index;
@@ -579,7 +581,7 @@ bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr)
*
* LOCK must be applied
*/
void removeBeaconInetAddr (struct in_addr *pnet_addr)
void removeBeaconInetAddr (const struct in_addr *pnet_addr)
{
bhe *pBHE;
bhe **ppBHE;

View File

@@ -1,4 +1,5 @@
/************************************************************************/
/* $Id$ */
/* */
/* L O S A L A M O S */
/* Los Alamos National Laboratory */
@@ -45,6 +46,7 @@
/* 021794 joh turn on SO_REUSEADDR only after the test for */
/* address in use so that test works on UNIX */
/* kernels that support multicast */
/* $Log$ */
/* */
/*_begin */
/************************************************************************/
@@ -94,8 +96,9 @@ LOCAL char *getToken(char **ppString);
*
*/
int alloc_ioc(
struct in_addr *pnet_addr,
struct ioc_in_use **ppiiu
const struct in_addr *pnet_addr,
unsigned short port,
struct ioc_in_use **ppiiu
)
{
int status;
@@ -127,6 +130,7 @@ struct ioc_in_use **ppiiu
status = create_net_chan(
ppiiu,
pnet_addr,
port,
IPPROTO_TCP);
if(status == ECA_NORMAL){
pBHE->piiu = *ppiiu;
@@ -145,7 +149,8 @@ struct ioc_in_use **ppiiu
*/
int create_net_chan(
struct ioc_in_use **ppiiu,
struct in_addr *pnet_addr, /* only used by TCP connections */
const struct in_addr *pnet_addr, /* only used by TCP connections */
unsigned short port,
int net_proto
)
{
@@ -190,8 +195,7 @@ int net_proto
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 =
htons (ca_static->ca_server_port);
pNode->destAddr.inetAddr.sin_port = htons (port);
ellAdd(&piiu->destAddr, &pNode->node);
piiu->recvBytes = tcp_recv_msg;
piiu->sendBytes = cac_tcp_send_msg_piiu;
@@ -398,7 +402,7 @@ int net_proto
* let slib pick lcl addr
*/
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(0);
saddr.sin_port = htons(0U);
status = bind( sock,
(struct sockaddr *) &saddr,
@@ -584,8 +588,14 @@ void notify_ca_repeater()
* 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
*
* recent versions of UCX will not accept a zero
* length message and we will assume that folks
* using newer versions of UCX have rebooted (and
* therefore restarted the CA repeater - and therefore
* moved it to an EPICS release that accepets this protocol)
*/
# ifdef SOLARIS
# if defined(SOLARIS) || defined(UCX)
len = sizeof(msg);
# else /* SOLARIS */
len = 0;
@@ -593,7 +603,7 @@ void notify_ca_repeater()
status = sendto(
piiuCast->sock_chan,
(char *)&msg, /* UCX requires a valid address here */
(char *)&msg,
len,
0,
(struct sockaddr *)&saddr,
@@ -601,11 +611,16 @@ void notify_ca_repeater()
if(status < 0){
if( MYERRNO != EINTR &&
MYERRNO != ENOBUFS &&
MYERRNO != EWOULDBLOCK){
MYERRNO != EWOULDBLOCK &&
/*
* This is returned from Linux when
* the repeater isnt running
*/
MYERRNO != ECONNREFUSED
){
ca_printf(
"send error => %s\n",
strerror(MYERRNO));
assert(0);
"CAC: error sending to repeater is \"%s\"\n",
strerror(MYERRNO));
}
}
else{
@@ -655,33 +670,28 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
status = sendto(
piiu->sock_chan,
&piiu->send.buf[piiu->send.rdix],
sendCnt,
(int) sendCnt,
0,
&pNode->destAddr.sockAddr,
sizeof(pNode->destAddr.sockAddr));
if(status<0){
if(status>=0){
actualSendCnt = (unsigned long) status;
assert (actualSendCnt == sendCnt);
pNode = (caAddrNode *) pNode->node.next;
}
else {
int localErrno;
localErrno = MYERRNO;
if( localErrno == EWOULDBLOCK &&
localErrno == ENOBUFS &&
localErrno == EINTR){
UNLOCK;
return;
}
else {
if( localErrno != EWOULDBLOCK &&
localErrno != ENOBUFS &&
localErrno != EINTR){
ca_printf(
"CAC: error on socket send() %s\n",
"CAC: UDP send error = \"%s\"\n",
strerror(localErrno));
}
TAG_CONN_DOWN(piiu);
break;
}
actualSendCnt = (unsigned long) status;
assert (actualSendCnt == sendCnt);
pNode = (caAddrNode *) pNode->node.next;
}
/*
@@ -739,26 +749,24 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
return;
}
assert (sendCnt<=INT_MAX);
status = send(
piiu->sock_chan,
&piiu->send.buf[piiu->send.rdix],
sendCnt,
(int) sendCnt,
0);
if (status<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 (status==0) {
TAG_CONN_DOWN(piiu);
UNLOCK;
return;
}
localError = MYERRNO;
@@ -901,9 +909,11 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
break;
}
assert (writeSpace<=INT_MAX);
status = recv( piiu->sock_chan,
&piiu->recv.buf[piiu->recv.wtix],
writeSpace,
(int) writeSpace,
0);
if(status == 0){
TAG_CONN_DOWN(piiu);
@@ -926,7 +936,7 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
break;
}
assert (status<=writeSpace);
assert (((unsigned long)status)<=writeSpace);
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
@@ -935,13 +945,8 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
* from this IOC
*/
piiu->timeAtLastRecv = ca_static->currentTime;
if (status != writeSpace) {
break;
}
}
UNLOCK;
return;
}
@@ -1042,8 +1047,17 @@ LOCAL void udp_recv_msg(struct ioc_in_use *piiu)
UNLOCK;
return;
}
# ifdef linux
/*
* Avoid spurious ECONNREFUSED bug
* in linux
*/
if (MYERRNO==ECONNREFUSED) {
UNLOCK;
return;
}
# endif
ca_printf("Unexpected UDP failure %s\n", strerror(MYERRNO));
TAG_CONN_DOWN(piiu);
}
else if(status > 0){
unsigned long bytesActual;
@@ -1195,6 +1209,8 @@ void close_ioc (struct ioc_in_use *piiu)
piiuCast = NULL;
}
else {
chid pNext;
/*
* remove IOC from the hash table
*/
@@ -1208,73 +1224,20 @@ void close_ioc (struct ioc_in_use *piiu)
* handler tries to use a channel before
* I mark it disconnected.
*/
chix = (chid) &piiu->chidlist.node.next;
while (chix = (chid) chix->node.next) {
chix->type = TYPENOTCONN;
chix->count = 0U;
chix = (chid) ellFirst(&piiu->chidlist);
while (chix) {
chix->state = cs_prev_conn;
chix->id.sid = ~0U;
chix->ar.read_access = FALSE;
chix->ar.write_access = FALSE;
/*
* try to reconnect
*/
chix->retry = 0U;
chix = (chid) ellNext(&chix->node);
}
if (piiu->chidlist.count) {
ca_signal (ECA_DISCONN,piiu->host_name_str);
chix = (chid) ellFirst(&piiu->chidlist);
while (chix) {
pNext = (chid) ellNext(&chix->node);
cacDisconnectChannel(chix, TRUE);
chix = pNext;
}
/*
* clear outstanding get call backs
*/
caIOBlockListFree (&pend_read_list, chix, TRUE, ECA_DISCONN);
/*
* clear outstanding put call backs
*/
caIOBlockListFree (&pend_write_list, chix, TRUE, ECA_DISCONN);
/*
* call their connection handler as required
*/
chix = (chid) &piiu->chidlist.node.next;
while (chix = (chid) chix->node.next) {
LOCKEVENTS;
if (chix->pConnFunc) {
struct connection_handler_args args;
args.chid = chix;
args.op = CA_OP_CONN_DOWN;
(*chix->pConnFunc) (args);
}
if (chix->pAccessRightsFunc) {
struct access_rights_handler_args args;
args.chid = chix;
args.ar = chix->ar;
(*chix->pAccessRightsFunc) (args);
}
UNLOCKEVENTS;
chix->piiu = piiuCast;
}
/*
* move all channels to the broadcast IIU
*
* if we loose the broadcast IIU its a severe error
*/
assert (piiuCast);
ellConcat (&piiuCast->chidlist, &piiu->chidlist);
assert (piiu->chidlist.count==0);
}
/*
* Try to reconnect
*/
ca_static->ca_search_retry = 0;
if (fd_register_func) {
LOCKEVENTS;
(*fd_register_func) (fd_register_arg, piiu->sock_chan, FALSE);
@@ -1297,11 +1260,78 @@ void close_ioc (struct ioc_in_use *piiu)
ellFree (&piiu->destAddr);
ca_signal (ECA_DISCONN,piiu->host_name_str);
free (piiu);
UNLOCK;
}
/*
* cacDisconnectChannel()
*/
void cacDisconnectChannel(chid chix, int fullDisconnect)
{
struct ioc_in_use *piiu;
chix->type = TYPENOTCONN;
chix->count = 0U;
chix->id.sid = ~0U;
chix->ar.read_access = FALSE;
chix->ar.write_access = FALSE;
/*
* try to reconnect
*/
chix->retry = 0U;
/*
* call their connection handler as required
*/
if (fullDisconnect) {
chix->state = cs_prev_conn;
/*
* clear outstanding get call backs
*/
caIOBlockListFree (&pend_read_list, chix,
TRUE, ECA_DISCONN);
/*
* clear outstanding put call backs
*/
caIOBlockListFree (&pend_write_list, chix,
TRUE, ECA_DISCONN);
LOCKEVENTS;
if (chix->pConnFunc) {
struct connection_handler_args args;
args.chid = chix;
args.op = CA_OP_CONN_DOWN;
(*chix->pConnFunc) (args);
}
if (chix->pAccessRightsFunc) {
struct access_rights_handler_args args;
args.chid = chix;
args.ar = chix->ar;
(*chix->pAccessRightsFunc) (args);
}
UNLOCKEVENTS;
}
piiu = (struct ioc_in_use *)chix->piiu;
ellDelete(&piiu->chidlist, &chix->node);
assert (piiuCast);
chix->piiu = piiuCast;
ellAdd(&piiuCast->chidlist, &chix->node);
/*
* Try to reconnect this channel
*/
ca_static->ca_search_retry = 0;
}
/*
@@ -1704,7 +1734,7 @@ void caPrintAddrList(ELLLIST *pList)
/*
* caFetchPortConfig()
*/
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
unsigned short caFetchPortConfig(ENV_PARAM *pEnv, unsigned short defaultPort)
{
long longStatus;
long epicsParam;
@@ -1712,30 +1742,113 @@ int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
longStatus = envGetLongConfigParam(pEnv, &epicsParam);
if (longStatus!=0) {
epicsParam = defaultPort;
epicsParam = (long) defaultPort;
ca_printf ("EPICS \"%s\" integer fetch failed\n", pEnv->name);
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, epicsParam);
}
/*
* This must be a server port that will fit in a signed
* This must be a server port that will fit in an unsigned
* short
*/
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>SHRT_MAX) {
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>USHRT_MAX) {
ca_printf ("EPICS \"%s\" out of range\n", pEnv->name);
/*
* Quit if the port is wrong due CA coding error
*/
assert (epicsParam != defaultPort);
epicsParam = defaultPort;
assert (epicsParam != (long) defaultPort);
epicsParam = (long) defaultPort;
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, epicsParam);
}
/*
* ok to clip to int here because we checked the range
*/
port = (int) epicsParam;
port = (unsigned short) epicsParam;
return port;
}
/*
* CAC_MUX_IO()
*/
void cac_mux_io(struct timeval *ptimeout)
{
int count;
struct timeval timeout;
cac_clean_iiu_list();
/*
* manage search timers and detect disconnects
*/
manage_conn(TRUE);
timeout = *ptimeout;
while (TRUE) {
count = cac_select_io(&timeout, CA_DO_RECVS|CA_DO_SENDS);
if (count<=0) {
/*
* if its a flush then loop until all
* of the send buffers are empty
*/
if (ca_static->ca_flush_pending) {
/*
* complete flush is postponed if we are
* inside an event routine
*/
if (EVENTLOCKTEST) {
break;
}
else {
if (caSendMsgPending()) {
LD_CA_TIME (SELECT_POLL, &timeout);
}
else {
ca_static->ca_flush_pending
= FALSE;
break;
}
}
}
else {
break;
}
}
else {
LD_CA_TIME (0.0, &timeout);
}
ca_process_input_queue();
}
}
/*
* caSendMsgPending()
*/
int caSendMsgPending()
{
int pending = FALSE;
unsigned long bytesPending;
struct ioc_in_use *piiu;
LOCK;
for( piiu = (IIU *) ellFirst(&iiuList);
piiu;
piiu = (IIU *) ellNext(&piiu->node)){
if(piiu == piiuCast || piiu->conn_up == FALSE){
continue;
}
bytesPending = cacRingBufferReadSize(&piiu->send, FALSE);
if(bytesPending > 0U){
pending = TRUE;
}
}
UNLOCK;
return pending;
}

View File

@@ -1,3 +1,4 @@
/* $Id */
/************************************************************************/
/* */
/* L O S A L A M O S */
@@ -28,7 +29,20 @@
/* .17 121892 joh added TCP send buf size var */
/* .18 122192 joh added outstanding ack var */
/* .19 012094 joh added minor version (for each server) */
/* */
/************************************************************************/
/* $Log$
* Revision 1.49 1995/10/12 01:33:12 jhill
* Initial delay between search frames went from .1 to .01 sec,
* Added flush pending flag, Make all usage of port be unsigned short.
*
* Revision 1.48 1995/09/29 21:55:38 jhill
* added func proto for cacDisconnectChannel()
*
* Revision 1.47 1995/08/22 00:20:27 jhill
* added KLUDGE def of S_db_Pending
*/
/*_begin */
/************************************************************************/
/* */
@@ -86,6 +100,7 @@ HDRVERSIONID(iocinfh, "$Id$")
#include <limits.h>
#include <stdarg.h>
#include <shareLib.h>
/*
* OS dependent includes
@@ -158,8 +173,8 @@ struct putCvrtBuf{
/*
* for use with cac_select_io()
*/
#define CA_DO_SENDS 1
#define CA_DO_RECVS 2
#define CA_DO_SENDS (1<<0)
#define CA_DO_RECVS (1<<1)
struct pending_io_event{
ELLNODE node;
@@ -190,8 +205,12 @@ extern const ca_time CA_CURRENT_TIME;
*/
#define MAXCONNTRIES 30 /* N conn retries on unchanged net */
#define SELECT_POLL (0.05) /* units sec - polls into recast */
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
/*
* NOTE: These must be larger than one vxWorks tick or we will end up
* using the CPU. A vxWorks tick is usually 1/60th of a sec.
*/
#define SELECT_POLL (0.025) /* units sec - polls into recast */
#define CA_RECAST_DELAY (0.025) /* 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) */
@@ -409,9 +428,11 @@ struct ca_static{
void (*ca_exception_func)
(struct exception_handler_args);
void *ca_exception_arg;
#if 0
void (*ca_connection_func)
(struct connection_handler_args);
void *ca_connection_arg;
#endif
int (*ca_printf_func)(const char *pformat, va_list args);
void (*ca_fd_register_func)
(void *, SOCKET, int);
@@ -430,6 +451,7 @@ struct ca_static{
unsigned ca_post_msg_active:1;
unsigned ca_manage_conn_active:1;
unsigned ca_repeater_contacted:1;
unsigned ca_flush_pending:1;
#if defined(vxWorks)
SEM_ID ca_io_done_sem;
SEM_ID ca_blockSem;
@@ -511,7 +533,7 @@ void issue_client_host_name(struct ioc_in_use *piiu);
int ca_defunct(void);
int ca_printf(char *pformat, ...);
void manage_conn(int silent);
void mark_server_available(struct in_addr *pnet_addr);
void mark_server_available(const struct in_addr *pnet_addr);
void flow_control(struct ioc_in_use *piiu);
int broadcast_addr(struct in_addr *pcastaddr);
void ca_repeater(void);
@@ -521,18 +543,19 @@ void ca_sg_init(void);
void ca_sg_shutdown(struct ca_static *ca_temp);
int cac_select_io(struct timeval *ptimeout, int flags);
void caHostFromInetAddr(
struct in_addr *pnet_addr,
char *pBuf,
unsigned size
const struct in_addr *pnet_addr,
char *pBuf,
unsigned size
);
int post_msg(
struct ioc_in_use *piiu,
struct in_addr *pnet_addr,
const struct in_addr *pnet_addr,
char *pInBuf,
unsigned long blockSize
);
int alloc_ioc(
struct in_addr *pnet_addr,
const struct in_addr *pnet_addr,
unsigned short port,
struct ioc_in_use **ppiiu
);
unsigned long cacRingBufferWrite(
@@ -565,7 +588,8 @@ char *localHostName(void);
int create_net_chan(
struct ioc_in_use **ppiiu,
struct in_addr *pnet_addr, /* only used by TCP connections */
const struct in_addr *pnet_addr, /* only used by TCP connections */
unsigned short port,
int net_proto
);
@@ -576,9 +600,9 @@ void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned port);
int ca_os_independent_init (void);
void freeBeaconHash(struct ca_static *ca_temp);
void removeBeaconInetAddr(struct in_addr *pnet_addr);
bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr);
bhe *createBeaconHashEntry(struct in_addr *pnet_addr);
void removeBeaconInetAddr(const struct in_addr *pnet_addr);
bhe *lookupBeaconInetAddr(const struct in_addr *pnet_addr);
bhe *createBeaconHashEntry(const struct in_addr *pnet_addr);
void close_ioc(IIU *piiu);
void notify_ca_repeater(void);
void cac_clean_iiu_list(void);
@@ -602,7 +626,9 @@ 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 ();
void caSetDefaultPrintfHandler (void);
void cacDisconnectChannel(chid chix, int fullDisconnect);
int caSendMsgPending(void);
/*
* !!KLUDGE!!
@@ -613,5 +639,6 @@ void caSetDefaultPrintfHandler ();
*/
#define M_dbAccess (501 <<16) /*Database Access Routines */
#define S_db_Blocked (M_dbAccess|39) /*Request is Blocked*/
#define S_db_Pending (M_dbAccess|37) /*Request is pending*/
#endif /* this must be the last line in this file */

View File

@@ -1,4 +1,5 @@
#ifndef __IOCMSG__
/* $Id$ */
/*
* History
* .01 01xx90 joh removed status field in favor of a independent m_cmmd-
@@ -23,6 +24,10 @@
* .09 050594 joh New command added for CA V4.3 - repeater fanout register
*
* .10 050594 joh New command added for CA V4.3 - wakeup the server
* $Log$
* Revision 1.23 1995/08/23 00:35:17 jhill
* added log entries
*
*/
#define __IOCMSG__
@@ -31,23 +36,29 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
/* TCP/UDP port number (bumped each protocol change) */
#define CA_PROTOCOL_VERSION 4
#define CA_MINOR_VERSION 4
#define CA_MINOR_VERSION 6
#define CA_UKN_MINOR_VERSION 0 /* unknown minor version */
#if CA_PROTOCOL_VERSION == 4
#define CA_V41(MAJOR,MINOR) ((MINOR)>=1)
#define CA_V42(MAJOR,MINOR) ((MINOR)>=2)
#define CA_V43(MAJOR,MINOR) ((MINOR)>=3)
#define CA_V44(MAJOR,MINOR) ((MINOR)>=4)
#define CA_V45(MAJOR,MINOR) ((MINOR)>=5)
#define CA_V46(MAJOR,MINOR) ((MINOR)>=6)
#elif CA_PROTOCOL_VERSION > 4
#define CA_V41(MAJOR,MINOR) ( 1 )
#define CA_V42(MAJOR,MINOR) ( 1 )
#define CA_V43(MAJOR,MINOR) ( 1 )
#define CA_V44(MAJOR,MINOR) ( 1 )
#define CA_V45(MAJOR,MINOR) ( 1 )
#define CA_V46(MAJOR,MINOR) ( 1 )
#else
#define CA_V41(MAJOR,MINOR) ( 0 )
#define CA_V42(MAJOR,MINOR) ( 0 )
#define CA_V43(MAJOR,MINOR) ( 0 )
#define CA_V44(MAJOR,MINOR) ( 0 )
#define CA_V45(MAJOR,MINOR) ( 0 )
#define CA_V46(MAJOR,MINOR) ( 0 )
#endif
/*
@@ -56,7 +67,7 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
* environment variables "EPICS_CA_REPEATER_PORT" and
* "EPICS_CA_SERVER_PORT"
*/
#define CA_PORT_BASE IPPORT_USERRESERVED + 56
#define CA_PORT_BASE IPPORT_USERRESERVED + 56U
#define CA_SERVER_PORT (CA_PORT_BASE+CA_PROTOCOL_VERSION*2)
#define CA_REPEATER_PORT (CA_PORT_BASE+CA_PROTOCOL_VERSION*2+1)
@@ -72,7 +83,7 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
typedef unsigned short ca_uint16_t;
typedef unsigned int ca_uint32_t;
typedef float ca_float32_t;
typedef ca_uint32_t caResId;
/* values for m_cmmd */
#define IOC_NOOP 0 /* do nothing, but verify TCP */
@@ -101,6 +112,7 @@ typedef float ca_float32_t;
#define IOC_ECHO 23 /* CA V4.3 connection verify */
#define REPEATER_REGISTER 24 /* registr for repeater fan out */
#define IOC_SIGNAL 25 /* knock the server out of select */
#define IOC_CLAIM_CIU_FAILED 26 /* unable to create chan resource in server */
/*
* for use with search and not_found (if search fails and
@@ -110,15 +122,15 @@ typedef float ca_float32_t;
#define DONTREPLY 5
/* size of object in bytes rounded up to nearest oct word */
#define OCT_ROUND(A) ((((unsigned long)A)+7)>>3)
#define OCT_ROUND(A) ((((unsigned long)(A))+7)>>3)
#define OCT_SIZEOF(A) (OCT_ROUND(sizeof(A)))
/* size of object in bytes rounded up to nearest long word */
#define QUAD_ROUND(A) (((unsigned long)A)+3)>>2)
#define QUAD_ROUND(A) (((unsigned long)(A))+3)>>2)
#define QUAD_SIZEOF(A) (QUAD_ROUND(sizeof(A)))
/* size of object in bytes rounded up to nearest short word */
#define BI_ROUND(A) ((((unsigned long)A)+1)>>1)
#define BI_ROUND(A) ((((unsigned long)(A))+1)>>1)
#define BI_SIZEOF(A) (BI_ROUND(sizeof(A)))
/*
@@ -169,4 +181,5 @@ struct monops { /* monitor req opi to ioc */
struct mon_info m_info;
};
#endif
#endif /* __IOCMSG__ */

View File

@@ -38,7 +38,7 @@ static char *sccsId = "@(#) $Id$";
#include <stdio.h>
#include <string.h>
#ifdef _WINDOWS
#ifdef WIN32
# include <winsock.h>
#else
# include <sys/types.h>
@@ -54,7 +54,10 @@ static char *sccsId = "@(#) $Id$";
/*
* caHostFromInetAddr()
*/
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
void caHostFromInetAddr(
const struct in_addr *pnet_addr,
char *pBuf,
unsigned size)
{
char *pString;
struct hostent *ent;

View File

@@ -25,7 +25,9 @@
* .11 GeG 120992 support VMS/UCX
* .12 CJM 130794 define MYERRNO properly for UCX
* .13 CJM 311094 mods to support DEC C compiler
*
* .14 joh 100695 removed UNIX include of filio.h and sockio.h
* because they are include by ioctl.h under
* BSD and SVR4 (and they dont exist under linux)
*/
#ifndef INCos_depenh
@@ -51,6 +53,14 @@ static char *os_depenhSccsId = "$Id$";
# include <netinet/tcp.h>
# include <net/if.h>
# include <arpa/inet.h>
# include <netdb.h>
/*
* normally these are included by ioctl.h
*/
# ifdef SOLARIS
# include <sys/filio.h>
# include <sys/sockio.h>
# endif
# define CA_OS_CONFIGURED
#endif
@@ -123,16 +133,16 @@ static char *os_depenhSccsId = "$Id$";
# define CA_OS_CONFIGURED
#endif /*VMS*/
#ifdef _WINDOWS
#ifdef WIN32
# include <errno.h>
# include <time.h>
# include <windows.h>
# include <winsock.h>
# define CA_OS_CONFIGURED
#endif /*_WINDOWS*/
#endif /*WIN32*/
#ifndef CA_OS_CONFIGURED
#error Please define one of vxWorks, UNIX VMS, or _WINDOWS
#error Please define one of vxWorks, UNIX, VMS, or WIN32
#endif
/*
@@ -213,6 +223,13 @@ static char *os_depenhSccsId = "$Id$";
#define DELAYTICKS 50L /* (adjust units below) */
#define TICKSPERSEC 1000L /* mili sec per sec */
/*
* BSD prototypes missing from SUNOS4, MULTINET and
* perhaps other environments
*/
#include <epicsTypes.h>
#include <bsdProto.h>
/*
* order of ops is important here
*
@@ -290,25 +307,26 @@ static char *os_depenhSccsId = "$Id$";
# define INVALID_SOCKET (-1)
#endif
#ifdef _WINDOWS
#ifdef WIN32
# define LOCK
# define UNLOCK
# define LOCKEVENTS
# define UNLOCKEVENTS
# define EVENTLOCKTEST (post_msg_active)
# define MAXHOSTNAMELEN 75
# define IPPORT_USERRESERVED 5000
# define IPPORT_USERRESERVED 5000U
# define EWOULDBLOCK WSAEWOULDBLOCK
# define ENOBUFS WSAENOBUFS
# define ECONNRESET WSAECONNRESET
# define ETIMEDOUT WSAETIMEDOUT
# define EADDRINUSE WSAEADDRINUSE
# define ECONNREFUSED WSAECONNREFUSED
# define socket_close(S) closesocket(S)
# define socket_ioctl(A,B,C) ioctlsocket(A,B,C)
# define MYERRNO WSAGetLastError()
# define POST_IO_EV
# define SYSFREQ 1000000L /* 1 MHz */
#endif /*_WINDOWS*/
#endif /*WIN32*/
#endif

View File

@@ -28,6 +28,10 @@
*
* Modification Log:
* -----------------
* $Log$
* Revision 1.15 1995/08/22 00:22:07 jhill
* Dont recompute connection timers if the time stamp hasnt changed
*
*
*/
@@ -53,49 +57,21 @@ void cac_gettimeval(struct timeval *pt)
assert(status == 0);
}
/*
* CAC_MUX_IO()
*
* Asynch notification of incomming messages under UNIX
* 1) Wait no longer than timeout
* 2) Return early if nothing outstanding
*
*
*/
void cac_mux_io(struct timeval *ptimeout)
{
int count;
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);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(count>0);
}
/*
* cac_block_for_io_completion()
*/
void cac_block_for_io_completion(struct timeval *pTV)
{
cac_mux_io(pTV);
cac_mux_io (pTV);
}
/*
* cac_block_for_sg_completion()
*/
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
{
cac_mux_io (pTV);
}
@@ -117,12 +93,6 @@ void os_specific_sg_delete(CASG *pcasg)
{
}
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
{
cac_mux_io(pTV);
}
/*
* CAC_ADD_TASK_VARIABLE()
@@ -140,17 +110,36 @@ int cac_add_task_variable(struct ca_static *ca_temp)
int cac_os_depen_init(struct ca_static *pcas)
{
int status;
struct sigaction sa;
ca_static = pcas;
/*
* dont allow disconnect to terminate process
* when running in UNIX enviroment
* when running in UNIX environment
*
* allow error to be returned to sendto()
* instead of handling disconnect at interrupt
*/
signal(SIGPIPE,SIG_IGN);
status = sigaction(SIGPIPE, NULL, &sa);
if (status==0) {
if (sa.sa_handler == SIG_DFL) {
sa.sa_handler = SIG_IGN;
status = sigaction(SIGPIPE, &sa, NULL);
if (status) {
ca_printf(
"%s: Error from signal replace was \"%s\"\n",
__FILE__,
strerror(MYERRNO));
}
}
}
else {
ca_printf(
"%s: Error from signal query was \"%s\"\n",
__FILE__,
strerror(MYERRNO));
}
status = ca_os_independent_init ();

View File

@@ -1,4 +1,6 @@
/*
* $Id$
*
* REPEATER.C
*
* CA broadcast repeater
@@ -29,7 +31,7 @@
* PURPOSE:
* Broadcasts fan out over the LAN, but UDP does not allow
* two processes on the same machine to get the same broadcast.
* This code takes extends the broadcast model from the net to within
* This code extends the broadcast model from the net to within
* the OS.
*
* NOTES:
@@ -57,29 +59,39 @@
* .06 120492 joh removed unnecessary includes
* .07 120992 joh now uses dll list routines
* .08 102993 joh toggle set sock opt to set
* .09 070195 joh discover client has vanished by connecting its
* datagram socket (and watching for ECONNREFUSED)
*
* $Log$
*/
static char *sccsId = "@(#)$Id$";
#include "iocinf.h"
/*
* one socket per client so we will get the ECONNREFUSED
* error code (and then delete the client)
*/
struct one_client{
ELLNODE node;
struct sockaddr_in from;
SOCKET sock;
};
/*
* these can be external since there is only one instance
* per machine so we dont care about reentrancy
*/
struct one_client{
ELLNODE node;
struct sockaddr_in from;
};
static ELLLIST client_list;
static char buf[MAX_UDP];
LOCAL int clean_client(struct one_client *pclient);
LOCAL void register_new_client(SOCKET sock, struct sockaddr_in *pLocal,
LOCAL void register_new_client(struct sockaddr_in *pLocal,
struct sockaddr_in *pFrom);
#define PORT_ANY 0U
LOCAL SOCKET makeSocket(unsigned short port);
LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize);
/*
@@ -93,14 +105,10 @@ void ca_repeater()
int status;
int size;
SOCKET sock;
int true = 1;
struct sockaddr_in from;
struct sockaddr_in bd;
struct sockaddr_in local;
int from_size = sizeof from;
struct one_client *pclient;
struct one_client *pnxtclient;
short port;
unsigned short port;
port = caFetchPortConfig(
&EPICS_CA_REPEATER_PORT,
@@ -108,37 +116,20 @@ void ca_repeater()
ellInit(&client_list);
/* allocate a socket */
sock = socket( AF_INET, /* domain */
SOCK_DGRAM, /* type */
0); /* deflt proto */
assert(sock != INVALID_SOCKET);
memset((char *)&bd, 0, sizeof(bd));
bd.sin_family = AF_INET;
bd.sin_addr.s_addr = INADDR_ANY;
bd.sin_port = htons(port);
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
if(status<0){
if(MYERRNO != EADDRINUSE){
ca_printf("CA Repeater: unexpected bind fail %s\n",
strerror(MYERRNO));
sock = makeSocket(port);
if (sock==INVALID_SOCKET) {
/*
* test for server was already started
*/
if (MYERRNO==EADDRINUSE) {
exit(0);
}
socket_close(sock);
ca_printf("%s: Unable to create repeater socket because \"%s\"\n",
__FILE__,
strerror(MYERRNO));
exit(0);
}
status = setsockopt( sock,
SOL_SOCKET,
SO_REUSEADDR,
(char *)&true,
sizeof(true));
if(status<0){
ca_printf( "%s: set socket option failed\n",
__FILE__);
}
status = local_addr(sock, &local);
if(status != OK){
ca_printf(
@@ -162,80 +153,142 @@ void ca_repeater()
&from_size);
if(size < 0){
# ifdef linux
/*
* Avoid spurious ECONNREFUSED bug
* in linux
*/
if (MYERRNO==ECONNREFUSED) {
continue;
}
# endif
ca_printf("CA Repeater: recv err %s\n",
strerror(MYERRNO));
continue;
}
pMsg = (struct extmsg *) buf;
/*
* both zero leng message and a registartion message
* both zero length message and a registration message
* will register a new client
*/
if(size >= sizeof(*pMsg)){
if(ntohs(pMsg->m_cmmd) == REPEATER_REGISTER){
register_new_client(sock, &local, &from);
register_new_client(&local, &from);
/*
* strip register client message
*/
pMsg++;
size -= sizeof(*pMsg);
if (size==0) {
continue;
}
}
}
else if(size == 0){
register_new_client(sock, &local, &from);
register_new_client(&local, &from);
continue;
}
fanOut(&from, (char *) pMsg, size);
}
}
/*
* fanOut()
*/
LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize)
{
ELLLIST theClients;
struct one_client *pclient;
int status;
ellInit(&theClients);
while (pclient=(struct one_client *)ellGet(&client_list)) {
ellAdd(&theClients, &pclient->node);
/*
* size may have been adjusted above
* Dont reflect back to sender
*/
if(size){
for( pclient = (struct one_client *)
client_list.node.next;
pclient;
pclient = (struct one_client *)
pclient->node.next){
if(pFrom->sin_port == pclient->from.sin_port &&
pFrom->sin_addr.s_addr == pclient->from.sin_addr.s_addr){
continue;
}
/*
* Dont reflect back to sender
*/
if(from.sin_port == pclient->from.sin_port &&
from.sin_addr.s_addr ==
pclient->from.sin_addr.s_addr){
continue;
}
status = sendto(
sock,
(char *)pMsg,
size,
0,
(struct sockaddr *)&pclient->from,
sizeof pclient->from);
if(status < 0){
ca_printf("CA Repeater: fanout err %s\n",
strerror(MYERRNO));
}
status = send(
pclient->sock,
(char *)pMsg,
msgSize,
0);
if (status>=0) {
#ifdef DEBUG
ca_printf("Sent\n");
ca_printf("Sent to %d\n",
pclient->from.sin_port);
#endif
}
if(status < 0){
if (MYERRNO == ECONNREFUSED) {
#ifdef DEBUG
ca_printf("Deleted client %d\n",
pclient->from.sin_port);
#endif
ellDelete(&theClients,
&pclient->node);
socket_close(pclient->sock);
free(pclient);
}
else {
ca_printf(
"CA Repeater: fan out err was \"%s\"\n",
strerror(MYERRNO));
}
}
/*
* remove any dead wood prior to pending
*/
for( pclient = (struct one_client *)
client_list.node.next;
pclient;
pclient = pnxtclient){
/* do it now in case item deleted */
pnxtclient = (struct one_client *)
pclient->node.next;
clean_client(pclient);
}
}
ellConcat(&client_list, &theClients);
}
/*
* makeSocket()
*/
LOCAL SOCKET makeSocket(unsigned short port)
{
int status;
struct sockaddr_in bd;
SOCKET sock;
int true = 1;
sock = socket( AF_INET, /* domain */
SOCK_DGRAM, /* type */
0); /* deflt proto */
if (sock == INVALID_SOCKET) {
return sock;
}
status = setsockopt( sock,
SOL_SOCKET,
SO_REUSEADDR,
(char *)&true,
sizeof(true));
if(status<0){
ca_printf( "%s: set socket option failed\n",
__FILE__);
}
memset((char *)&bd, 0, sizeof(bd));
bd.sin_family = AF_INET;
bd.sin_addr.s_addr = INADDR_ANY;
bd.sin_port = htons(port);
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
if(status<0){
socket_close(sock);
return INVALID_SOCKET;
}
return sock;
}
@@ -243,17 +296,17 @@ void ca_repeater()
* register_new_client()
*/
LOCAL void register_new_client(
SOCKET sock,
struct sockaddr_in *pLocal,
struct sockaddr_in *pFrom)
{
int status;
struct one_client *pclient;
struct extmsg confirm;
struct extmsg noop;
for( pclient = (struct one_client *) client_list.node.next;
for( pclient = (struct one_client *) ellFirst(&client_list);
pclient;
pclient = (struct one_client *) pclient->node.next){
pclient = (struct one_client *) ellNext(&pclient->node)){
if( pFrom->sin_port == pclient->from.sin_port &&
pFrom->sin_addr.s_addr == pclient->from.sin_addr.s_addr)
@@ -262,101 +315,73 @@ struct sockaddr_in *pFrom)
if(!pclient){
pclient = (struct one_client *)calloc (1, sizeof(*pclient));
if(pclient){
pclient->from = *pFrom;
ellAdd (&client_list, &pclient->node);
#ifdef DEBUG
ca_printf (
"Added %d\n",
pFrom->sin_port);
#endif
if(!pclient){
ca_printf("%s: no memory for new client\n",
__FILE__);
return;
}
pclient->sock = makeSocket(PORT_ANY);
if (!pclient->sock) {
free(pclient);
ca_printf("%s: no client sock because \"%s\"\n",
__FILE__,
strerror(MYERRNO));
return;
}
status = connect(pclient->sock,
(struct sockaddr *)pFrom,
sizeof(*pFrom));
if (status<0) {
socket_close(pclient->sock);
free(pclient);
ca_printf("%s: unable to connect client sock\n",
__FILE__);
return;
}
pclient->from = *pFrom;
ellAdd (&client_list, &pclient->node);
#ifdef DEBUG
ca_printf (
"Added %d\n",
pFrom->sin_port);
#endif
}
memset((char *)&confirm, 0, sizeof confirm);
memset((char *)&confirm, '\0', sizeof(confirm));
confirm.m_cmmd = htons(REPEATER_CONFIRM);
confirm.m_available = pLocal->sin_addr.s_addr;
status = sendto(
sock,
status = send(
pclient->sock,
(char *)&confirm,
sizeof(confirm),
0,
(struct sockaddr *)pFrom, /* back to sender */
sizeof(*pFrom));
if(status != sizeof(confirm)){
ca_printf("CA Repeater: confirm err %s\n",
strerror(MYERRNO));
0);
if(status >= 0){
assert(status == sizeof(confirm));
}
}
/*
*
* check to see if this client is still around
*
* NOTE:
* This closes the socket only whenever we are
* able to bind so that we free the port.
*/
LOCAL int clean_client(struct one_client *pclient)
{
static int sockExists;
static SOCKET sock;
int port = pclient->from.sin_port;
struct sockaddr_in bd;
int status;
int present = FALSE;
/*
* allocate a socket
* (no lock required because this is implemented with
* a single thread)
*/
if(!sockExists){
sock = socket(
AF_INET, /* domain */
SOCK_DGRAM, /* type */
0); /* deflt proto */
if(sock != INVALID_SOCKET){
sockExists = TRUE;
}
else{
ca_printf("CA Repeater: no bind test sock err %s\n",
strerror(MYERRNO));
return OK;
}
}
memset((char *)&bd, 0, sizeof(bd));
bd.sin_family = AF_INET;
bd.sin_addr.s_addr = INADDR_ANY;
bd.sin_port = port;
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
if(status>=0){
socket_close (sock);
sockExists = FALSE;
}
else{
if(MYERRNO == EADDRINUSE){
present = TRUE;
}
else{
ca_printf("CA Repeater: client cleanup err %s\n",
strerror(MYERRNO));
ca_printf("CA Repeater: sock=%d family=%d addr=%x port=%d\n",
sock, bd.sin_family, bd.sin_addr.s_addr,
bd.sin_port);
}
}
if(!present){
else if (MYERRNO == ECONNREFUSED){
#ifdef DEBUG
ca_printf("Deleted %d\n", pclient->from.sin_port);
ca_printf("Deleted repeater client=%d sending ack\n",
pFrom->sin_port);
#endif
ellDelete(&client_list, &pclient->node);
socket_close(pclient->sock);
free(pclient);
}
else {
ca_printf("CA Repeater: confirm err was \"%s\"\n",
strerror(MYERRNO));
}
return OK;
/*
* send a noop message to all other clients so that we dont
* accumulate sockets when there are no beacons
*/
memset((char *)&noop, '\0', sizeof(noop));
confirm.m_cmmd = htons(IOC_NOOP);
fanOut(pFrom, (char *)&noop, sizeof(noop));
}

View File

@@ -81,12 +81,12 @@ chid chan
LOCAL int cacMsg(
struct ioc_in_use *piiu,
struct in_addr *pnet_addr
const struct in_addr *pnet_addr
);
LOCAL void perform_claim_channel(
IIU *piiu,
struct in_addr *pnet_addr
const struct in_addr *pnet_addr
);
#ifdef CONVERSION_REQUIRED
@@ -103,7 +103,7 @@ extern CACVRTFUNC *cac_dbr_cvrt[];
*/
int post_msg(
struct ioc_in_use *piiu,
struct in_addr *pnet_addr,
const struct in_addr *pnet_addr,
char *pInBuf,
unsigned long blockSize
)
@@ -236,7 +236,7 @@ unsigned long blockSize
*/
LOCAL int cacMsg(
struct ioc_in_use *piiu,
struct in_addr *pnet_addr
const struct in_addr *pnet_addr
)
{
evid monix;
@@ -263,8 +263,6 @@ struct in_addr *pnet_addr
&piiu->curMsg.m_available);
UNLOCK;
if(!monix){
ca_signal(ECA_INTERNAL,
"bad client write io id from server");
break;
}
@@ -293,9 +291,8 @@ struct in_addr *pnet_addr
}
LOCK;
ellDelete(&pend_write_list, &monix->node);
UNLOCK;
caIOBlockFree(monix);
UNLOCK;
break;
@@ -314,8 +311,6 @@ struct in_addr *pnet_addr
&piiu->curMsg.m_available);
UNLOCK;
if(!monix){
ca_signal(ECA_INTERNAL,
"bad client read notify io id from server");
break;
}
@@ -366,8 +361,8 @@ struct in_addr *pnet_addr
}
LOCK;
ellDelete(&pend_read_list, &monix->node);
UNLOCK;
caIOBlockFree(monix);
UNLOCK;
break;
}
@@ -385,8 +380,6 @@ struct in_addr *pnet_addr
&piiu->curMsg.m_available);
UNLOCK;
if(!monix){
ca_signal(ECA_INTERNAL,
"bad client event id from server");
break;
}
@@ -398,8 +391,8 @@ struct in_addr *pnet_addr
if (!piiu->curMsg.m_postsize) {
LOCK;
ellDelete(&monix->chan->eventq, &monix->node);
UNLOCK;
caIOBlockFree(monix);
UNLOCK;
break;
}
@@ -466,8 +459,6 @@ struct in_addr *pnet_addr
&piiu->curMsg.m_available);
UNLOCK;
if(!pIOBlock){
ca_signal(ECA_INTERNAL,
"bad client read io id from server");
break;
}
@@ -487,7 +478,8 @@ struct in_addr *pnet_addr
FALSE,
piiu->curMsg.m_count);
# else
if (piiu->curMsg.m_type == DBR_STRING) {
if (piiu->curMsg.m_type == DBR_STRING &&
piiu->curMsg.m_count == 1u) {
strcpy ((char *)pIOBlock->usr_arg,
piiu->pCurData);
}
@@ -509,8 +501,8 @@ struct in_addr *pnet_addr
}
LOCK;
ellDelete(&pend_read_list, &pIOBlock->node);
UNLOCK;
caIOBlockFree(pIOBlock);
UNLOCK;
break;
}
case IOC_SEARCH:
@@ -548,6 +540,7 @@ struct in_addr *pnet_addr
case IOC_ERROR:
{
ELLLIST *pList = NULL;
evid monix;
char nameBuf[64];
char context[255];
@@ -584,32 +577,30 @@ struct in_addr *pnet_addr
*/
monix = NULL;
args.addr = NULL;
LOCK;
switch (ntohs(req->m_cmmd)) {
case IOC_READ_NOTIFY:
LOCK;
monix = (evid) bucketLookupItemUnsignedId(
pFastBucket,
&req->m_available);
UNLOCK;
pList = &pend_read_list;
op = CA_OP_GET;
break;
case IOC_READ:
LOCK;
monix = (evid) bucketLookupItemUnsignedId(
pFastBucket,
&req->m_available);
UNLOCK;
if(monix){
args.addr = monix->usr_arg;
}
pList = &pend_read_list;
op = CA_OP_GET;
break;
case IOC_WRITE_NOTIFY:
LOCK;
monix = (evid) bucketLookupItemUnsignedId(
pFastBucket,
&req->m_available);
UNLOCK;
pList = &pend_write_list;
op = CA_OP_PUT;
break;
case IOC_WRITE:
@@ -619,19 +610,18 @@ struct in_addr *pnet_addr
op = CA_OP_SEARCH;
break;
case IOC_EVENT_ADD:
LOCK;
monix = (evid) bucketLookupItemUnsignedId(
pFastBucket,
&req->m_available);
UNLOCK;
op = CA_OP_ADD_EVENT;
if (monix) {
pList = &monix->chan->eventq;
}
break;
case IOC_EVENT_CANCEL:
LOCK;
monix = (evid) bucketLookupItemUnsignedId(
pFastBucket,
&req->m_available);
UNLOCK;
op = CA_OP_CLEAR_EVENT;
break;
default:
@@ -640,10 +630,12 @@ struct in_addr *pnet_addr
}
if (monix) {
if (pList) {
ellDelete(pList, &monix->node);
}
caIOBlockFree(monix);
}
LOCK;
args.chid = bucketLookupItemUnsignedId
(pSlowBucket, &piiu->curMsg.m_cid);
UNLOCK;
@@ -710,6 +702,31 @@ struct in_addr *pnet_addr
reconnect_channel(piiu, chan);
break;
}
case IOC_CLAIM_CIU_FAILED:
{
chid chan;
LOCK;
chan = bucketLookupItemUnsignedId(
pSlowBucket, &piiu->curMsg.m_cid);
UNLOCK;
if(!chan){
/*
* end up here if they delete the channel
* prior to this response
*/
break;
}
/*
* need to move the channel back to the cast IIU
* (so we will be able to reconnect)
*/
LOCK;
cacDisconnectChannel(chan, FALSE);
UNLOCK;
break;
}
default:
ca_printf("CAC: post_msg(): Corrupt cmd in msg %x\n",
piiu->curMsg.m_cmmd);
@@ -728,16 +745,18 @@ struct in_addr *pnet_addr
*/
LOCAL void perform_claim_channel(
IIU *piiu,
struct in_addr *pnet_addr
const struct in_addr *pnet_addr
)
{
int v42;
unsigned short port;
char rej[64];
chid chan;
int status;
IIU *allocpiiu;
IIU *chpiiu;
unsigned short *pMinorVersion;
unsigned minorVersion;
/*
* ignore broadcast replies for deleted channels
@@ -792,8 +811,31 @@ struct in_addr *pnet_addr
return;
}
status = alloc_ioc(pnet_addr, &allocpiiu);
switch(status){
/*
* Starting with CA V4.1 the minor version number
* is appended to the end of each search reply.
* This value is ignored by earlier clients.
*/
if(piiu->curMsg.m_postsize >= sizeof(*pMinorVersion)){
pMinorVersion = (unsigned short *)(piiu->pCurData);
minorVersion = ntohs(*pMinorVersion);
}
else{
minorVersion = CA_UKN_MINOR_VERSION;
}
/*
* the type field is abused to carry the port number
* so that we can have multiple servers on one host
*/
if (CA_V45 (CA_PROTOCOL_VERSION,minorVersion)) {
port = piiu->curMsg.m_type;
}
else {
port = ca_static->ca_server_port;
}
status = alloc_ioc (pnet_addr, port, &allocpiiu);
switch (status) {
case ECA_NORMAL:
break;
@@ -801,7 +843,7 @@ struct in_addr *pnet_addr
case ECA_DISCONN:
/*
* This indicates that the connection is tagged
* is tagged for shutdown and we are waiting for
* for shutdown and we are waiting for
* it to go away. Search replies are ignored
* in the interim.
*/
@@ -818,22 +860,11 @@ struct in_addr *pnet_addr
}
/*
* Starting with CA V4.1 the minor version number
* is appended to the end of each search reply.
* This value is ignored by earlier clients.
*/
if(piiu->curMsg.m_postsize >= sizeof(*pMinorVersion)){
pMinorVersion = (unsigned short *)(piiu->pCurData);
allocpiiu->minor_version_number = ntohs(*pMinorVersion);
}
else{
allocpiiu->minor_version_number = CA_UKN_MINOR_VERSION;
}
allocpiiu->minor_version_number = minorVersion;
ellDelete(&chpiiu->chidlist, &chan->node);
ellDelete (&chpiiu->chidlist, &chan->node);
chan->piiu = allocpiiu;
ellAdd(&allocpiiu->chidlist, &chan->node);
ellAdd (&allocpiiu->chidlist, &chan->node);
ca_static->ca_search_responses++;
/*
@@ -842,7 +873,7 @@ struct in_addr *pnet_addr
* the client's name to the server.
* (CA V4.1 or higher)
*/
if(ellCount(&allocpiiu->chidlist)==1){
if (ellCount(&allocpiiu->chidlist)==1) {
issue_identify_client(allocpiiu);
issue_client_host_name(allocpiiu);
}
@@ -963,9 +994,6 @@ chid chan
/* decrement the outstanding IO count */
CLRPENDRECV(TRUE);
}
UNLOCK;
}

View File

@@ -28,6 +28,13 @@
*
* Modification Log:
* -----------------
* $Log$
* Revision 1.17 1995/09/29 22:13:59 jhill
* check for nill dbr pointer
*
* Revision 1.16 1995/08/22 00:27:55 jhill
* added cvs style mod log
*
*
* NOTES:
* 1) Need to fix if the OP is on a FD that
@@ -97,7 +104,7 @@ void ca_sg_shutdown(struct ca_static *ca_temp)
/*
* ca_sg_create()
*/
int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
int epicsShareAPI ca_sg_create(CA_SYNC_GID *pgid)
{
int status;
CASG *pcasg;
@@ -130,29 +137,38 @@ int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
*/
memset((char *)pcasg,0,sizeof(*pcasg));
pcasg->magic = CASG_MAGIC;
pcasg->id = CLIENT_SLOW_ID_ALLOC;
pcasg->opPendCount = 0;
pcasg->seqNo = 0;
os_specific_sg_create(pcasg);
status = bucketAddItemUnsignedId(pSlowBucket, &pcasg->id, pcasg);
if(status == BUCKET_SUCCESS){
do {
pcasg->id = CLIENT_SLOW_ID_ALLOC;
status = bucketAddItemUnsignedId (pSlowBucket,
&pcasg->id, pcasg);
} while (status == S_bucket_idInUse);
if (status == S_bucket_success) {
/*
* place it on the active sync group list
*/
ellAdd(&ca_static->activeCASG, &pcasg->node);
* place it on the active sync group list
*/
ellAdd (&ca_static->activeCASG, &pcasg->node);
}
else{
else {
/*
* place it back on the free sync group list
*/
ellAdd(&ca_static->freeCASG, &pcasg->node);
ellAdd (&ca_static->freeCASG, &pcasg->node);
UNLOCK;
if (status == S_bucket_noMemory) {
return ECA_ALLOCMEM;
}
else {
return ECA_INTERNAL;
}
}
UNLOCK;
if(status != BUCKET_SUCCESS){
return ECA_ALLOCMEM;
}
*(WRITEABLE_CA_SYNC_GID *)pgid = pcasg->id;
return ECA_NORMAL;
@@ -162,7 +178,7 @@ int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
/*
* ca_sg_delete()
*/
int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
int epicsShareAPI ca_sg_delete(CA_SYNC_GID gid)
{
int status;
CASG *pcasg;
@@ -183,7 +199,7 @@ int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
}
status = bucketRemoveItemUnsignedId(pSlowBucket, &gid);
assert(status == BUCKET_SUCCESS);
assert (status == S_bucket_success);
os_specific_sg_delete(pcasg);
@@ -200,7 +216,7 @@ int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
/*
* ca_sg_block()
*/
int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
int epicsShareAPI ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
{
struct timeval beg_time;
ca_real delay;
@@ -237,16 +253,11 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
UNLOCK;
/*
* always flush and take care
* of connection management
* at least once.
* always flush at least once.
*/
ca_flush_io();
ca_static->ca_flush_pending = TRUE;
/*
* the current time set within ca_flush_io()
* above.
*/
cac_gettimeval (&ca_static->currentTime);
beg_time = ca_static->currentTime;
delay = 0.0;
@@ -257,9 +268,23 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
/*
* Exit if the timeout has expired
* (dont wait forever for an itsy bitsy
* delay which will no be updated if
* select is called with no delay)
*
* current time is only updated by
* cac_select_io() if we specify
* at least 1 usec to wait
*/
remaining = timeout-delay;
if (remaining<=0.0) {
if (remaining<=(1.0/USEC_PER_SEC)) {
/*
* Make sure that we take care of
* recv backlog at least once
*/
tmo.tv_sec = 0L;
tmo.tv_usec = 0L;
cac_mux_io (&tmo);
status = ECA_TIMEOUT;
break;
}
@@ -276,10 +301,6 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
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;
@@ -291,7 +312,7 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
/*
* ca_sg_reset
*/
int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
int epicsShareAPI ca_sg_reset(CA_SYNC_GID gid)
{
CASG *pcasg;
@@ -313,7 +334,7 @@ int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
/*
* ca_sg_test
*/
int APIENTRY ca_sg_test(CA_SYNC_GID gid)
int epicsShareAPI ca_sg_test(CA_SYNC_GID gid)
{
CASG *pcasg;
@@ -339,7 +360,7 @@ int APIENTRY ca_sg_test(CA_SYNC_GID gid)
/*
* ca_sg_array_put()
*/
int APIENTRY ca_sg_array_put(
int epicsShareAPI ca_sg_array_put(
CA_SYNC_GID gid,
chtype type,
unsigned long count,
@@ -404,7 +425,7 @@ void *pvalue)
/*
* ca_sg_array_get()
*/
int APIENTRY ca_sg_array_get(
int epicsShareAPI ca_sg_array_get(
CA_SYNC_GID gid,
chtype type,
unsigned long count,
@@ -505,7 +526,7 @@ LOCAL void io_complete(struct event_handler_args args)
* Update the user's variable
* (if its a get)
*/
if(pcasgop->pValue){
if(pcasgop->pValue && args.dbr){
size = dbr_size_n(args.type, args.count);
memcpy(pcasgop->pValue, args.dbr, size);
}

View File

@@ -19,7 +19,7 @@ static char *sccsId = "$Id$";
#include "iocinf.h"
void APIENTRY ca_test_event(struct event_handler_args args)
void epicsShareAPI 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

@@ -80,7 +80,7 @@ typedef int fd_set ;
#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)))
#define FD_ZERO(p) memset((char *)(p), 0, sizeof (*(p)))
#include <iodef.h>
#define IO$_RECEIVE (IO$_WRITEVBLK)

View File

@@ -28,6 +28,10 @@
*
* Modification Log:
* -----------------
* $Log$
* Revision 1.17 1995/08/22 00:27:56 jhill
* added cvs style mod log
*
*
*/
@@ -55,44 +59,6 @@ void cac_gettimeval(struct timeval *pt)
assert(status==0);
}
/*
* CAC_MUX_IO()
*
* Wait for send ready under VMS
* 1) Wait no longer than timeout
*
* Under VMS all recv's and input processing
* handled by ASTs
*/
void cac_mux_io(struct timeval *ptimeout)
{
int count;
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);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(count>0);
}
/*
* cac_block_for_io_completion()
@@ -286,7 +252,8 @@ void ca_spawn_repeater()
* gethostbyaddr(). This makes gethostbyaddr()
* hang when it is called from AST level.
*/
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
void caHostFromInetAddr(const struct in_addr *pnet_addr,
char *pBuf, unsigned size)
{
char *pString;

View File

@@ -28,6 +28,13 @@
*
* Modification Log:
* -----------------
* $Log$
* Revision 1.20 1995/10/12 01:35:31 jhill
* Moved cac_mux_io() to iocinf.c
*
* Revision 1.19 1995/08/22 00:27:58 jhill
* added cvs style mod log
*
*
*/
@@ -42,6 +49,7 @@ LOCAL int cac_os_depen_exit_tid (struct ca_static *pcas, int tid);
LOCAL int cac_add_task_variable (struct ca_static *ca_temp);
LOCAL void deleteCallBack(CALLBACK *pcb);
/*
* cac_gettimeval()
@@ -85,40 +93,6 @@ void cac_gettimeval(struct timeval *pt)
pt->tv_usec = ((current-sec*rate)*USEC_PER_SEC)/rate;
}
/*
* CAC_MUX_IO()
*
* Asynch notification of send unblocked for vxWorks
* 1) Wait no longer than timeout
* 2) Return early if nothing outstanding
*
*
*/
void cac_mux_io(struct timeval *ptimeout)
{
int count;
struct timeval timeout;
#if NOASYNCRECV
cac_clean_iiu_list();
#endif
timeout = *ptimeout;
do{
count = cac_select_io(
&timeout,
CA_DO_SENDS | CA_DO_RECVS);
timeout.tv_usec = 0;
timeout.tv_sec = 0;
}
while(count>0);
#if NOASYNCRECV
ca_process_input_queue();
manage_conn(TRUE);
#endif
}
/*
* cac_block_for_io_completion()
@@ -129,7 +103,7 @@ void cac_block_for_io_completion(struct timeval *pTV)
unsigned long ticks;
unsigned long rate = sysClkRateGet();
#if NOASYNCRECV
#ifdef NOASYNCRECV
cac_mux_io(pTV);
#else
/*
@@ -144,6 +118,12 @@ void cac_block_for_io_completion(struct timeval *pTV)
ticks = min(LOCALTICKS, ticks);
semTake(io_done_sem, ticks);
/*
* force a time update because we are not
* going to get one with a nill timeout in
* ca_mux_io()
*/
cac_gettimeval (&ca_static->currentTime);
#endif
}
@@ -191,7 +171,7 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
unsigned long ticks;
unsigned long rate = sysClkRateGet();
#if NOASYNCRECV
#ifdef NOASYNCRECV
cac_mux_io(pTV);
#else
/*
@@ -206,6 +186,12 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
ticks = min(LOCALTICKS, ticks);
semTake (pcasg->sem, ticks);
/*
* force a time update because we are not
* going to get one with a nill timeout in
* ca_mux_io()
*/
cac_gettimeval (&ca_static->currentTime);
#endif
}
@@ -601,7 +587,10 @@ char *localUserName()
/*
* caHostFromInetAddr()
*/
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
void caHostFromInetAddr(
const struct in_addr *pnet_addr,
char *pBuf,
unsigned size)
{
char str[INET_ADDR_LEN];
@@ -857,17 +846,18 @@ void cac_recv_task(int tid)
* ca_task_exit() is called.
*/
while(TRUE){
#if NOASYNCRECV
#ifdef NOASYNCRECV
taskDelay(60);
#else
cac_clean_iiu_list();
timeout.tv_usec = 50000;
/*
* NOTE: this must be longer than one vxWorks
* tick or we will infinite loop
*/
timeout.tv_usec = (4*USEC_PER_SEC)/sysClkRateGet();
timeout.tv_sec = 0;
count = cac_select_io(
&timeout,
CA_DO_SENDS | CA_DO_RECVS);
count = cac_select_io(&timeout, CA_DO_RECVS);
ca_process_input_queue();
manage_conn(TRUE);
#endif

View File

@@ -27,22 +27,30 @@
* Advanced Photon Source
* Argonne National Laboratory
*
* Lawrence Berkley National Laboratory
*
* Modification Log:
* -----------------
*
* $Log$
*/
/*
* Windows includes
*/
#include <windows.h>
#include <process.h>
#include <mmsystem.h>
#include "iocinf.h"
#ifndef _WINDOWS
#error This source is specific to DOS/WINDOS
#ifndef WIN32
#error This source is specific to WIN32
#endif
long offset_time; /* time diff (sec) between 1970 and when windows started */
DWORD prev_time;
static void init_timers();
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,
@@ -54,48 +62,25 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
*/
void cac_gettimeval(struct timeval *pt)
{
SYSTEMTIME st;
/**
The multi-media timers used here should be good to a millisecond
resolution. However, since the timer rolls back to 0 every 49.7
days (2^32 ms, 4,294,967.296 sec), it's not very good for
time stamping over long periods (if Windows is restarted more
often than 49 days, it wont be a problem). An attempt is made
to keep the time returned increasing, but there is no guarantee
the UTC time is right after 49 days.
**/
GetSystemTime(&st);
pt->tv_sec = (long)st.wSecond + (long)st.wMinute*60 +
(long)st.wHour*360;
pt->tv_usec = st.wMilliseconds*1000;
}
DWORD win_sys_time; /* time (ms) since windows started */
/*
* CAC_MUX_IO()
*
* Asynch notification of incomming messages under UNIX
* 1) Wait no longer than timeout
* 2) Return early if nothing outstanding
*
*
*/
void cac_mux_io(struct timeval *ptimeout)
{
int count;
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);
timeout.tv_sec = 0;
timeout.tv_usec = 0;
}
while(count>0);
win_sys_time = timeGetTime();
if (prev_time > win_sys_time) { /* must have been a timer roll-over */
offset_time += 4294967; /* add number of seconds in 49.7 days */
}
pt->tv_sec = (long)win_sys_time/1000 + offset_time; /* time (sec) since 1970 */
pt->tv_usec = (long)((win_sys_time % 1000) * 1000);
prev_time = win_sys_time;
}
@@ -138,8 +123,7 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
*/
int cac_os_depen_init(struct ca_static *pcas)
{
int status;
WSADATA WsaData;
int status;
ca_static = pcas;
@@ -153,10 +137,7 @@ int cac_os_depen_init(struct ca_static *pcas)
/* signal(SIGPIPE,SIG_IGN); */
# ifdef _WINSOCKAPI_
status = WSAStartup(MAKEWORD(1,1), &WsaData);
assert (status==0);
# endif
/* DllMain does most OS dependent init & cleanup */
status = ca_os_independent_init ();
@@ -290,11 +271,8 @@ int local_addr (SOCKET s, struct sockaddr_in *plcladdr)
*/
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){
@@ -352,6 +330,13 @@ static int get_subnet_mask ( char SubNetMaskStr[256])
return RegTcpParams (localadr, SubNetMaskStr);
}
/* For NT 3.51, enumerates network interfaces returns the ip address */
/* and subnet mask for the LAST interface found. This needs to be changed */
/* to work in conjuction with caDiscoverInterfaces to add all the */
/* add all the interfaces to the elist. Also could be more efficient in
calling */
/* RegKeyOpen */
static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
{
#define MAX_VALUE_NAME 128
@@ -360,37 +345,65 @@ static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
DWORD cbDataLen;
CHAR cbData[256];
DWORD dwType;
int status;
int status, i, card_cnt;
char *pNetCard[16], *pData;
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);
/****
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);
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");
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage");
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "Route", &dwType, cbData,
&cbDataLen);
if (status) {
return status;
}
i=0; card_cnt = 0; pData = cbData; /* enumerate network interfaces */
while( i < 16 && (pNetCard[i]=strtok(pData,"\"")) ) {
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\");
strcat(RegPath,pNetCard[i]);
strcat(RegPath,"\\Parameters\\Tcpip");
cbDataLen = sizeof(IpAddr);
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "IPAddress", &dwType,
IpAddr, &cbDataLen);
if (status == 0) {
cbDataLen = sizeof(SubNetMask);
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "SubnetMask",
&dwType, SubNetMask, &cbDataLen);
if (status)
return status;
card_cnt++;
}
pData += strlen(pNetCard[i])+3;
i++;
}
if (card_cnt == 0)
return 1;
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;
return 0;
}
@@ -417,7 +430,7 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
}
retCode = RegQueryValueEx (hKey, // Key handle returned from RegOpenKeyEx.
retCode = RegQueryValueEx (hKey, // Key handle returned from
lpzValueName, // Name of value.
NULL, // Reserved, dword = NULL.
lpdwType, // Type of data.
@@ -434,36 +447,61 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
BOOL epicsShareAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
int status;
WSADATA WsaData;
TIMECAPS tc;
UINT wTimerRes;
switch (dwReason) {
case DLL_PROCESS_ATTACH:
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0)
return FALSE;
#if _DEBUG /* for gui applications, setup console for error messages */
if (AllocConsole()) {
SetConsoleTitle("Channel Access Status");
freopen( "CONOUT$", "a", stderr );
fprintf(stderr, "Process attached to ca.dll R12\n");
}
fprintf(stderr, "Process attached to ca.dll R3.12.1\n");
#endif /* init. winsock */
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0) {
fprintf(stderr,"Cant init winsock \n");
return FALSE;
}
/* setup multi-media timer */
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
fprintf(stderr,"cant get timer info \n");
return FALSE;
}
/* set for 1 ms resoulution */
wTimerRes = min(max(tc.wPeriodMin, 1), tc.wPeriodMax);
status = timeBeginPeriod(wTimerRes);
if (status != TIMERR_NOERROR)
fprintf(stderr,"timer setup failed\n");
offset_time = (long)time(NULL) - (long)timeGetTime()/1000;
prev_time = timeGetTime();
break;
case DLL_PROCESS_DETACH:
timeEndPeriod(wTimerRes);
if ((status = WSACleanup()) !=0)
return FALSE;
break;
case DLL_THREAD_ATTACH:
fprintf(stderr, "Thread attached to ca.dll R12\n");
#if _DEBUG
fprintf(stderr, "Thread attached to ca.dll R3.12.1\n");
#endif
break;
case DLL_THREAD_DETACH:
fprintf(stderr, "Thread detached from ca.dll R12\n");
#if _DEBUG
fprintf(stderr, "Thread detached from ca.dll R3.12.1\n");
#endif
break;
default:
@@ -472,4 +510,8 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
return TRUE;
}

18
src/cvtDctsdr/Makefile Normal file
View File

@@ -0,0 +1,18 @@
#
# $Id$
#
# Lowest Level Directroy Makefile
# by Janet Anderson
#
# $Log$
# Revision 1.1 1994/09/07 19:25:39 jba
# New file
#
#
EPICS=../../..
include $(EPICS)/config/CONFIG_BASE
include $(EPICS)/config/RULES_ARCHS

View File

@@ -0,0 +1,54 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_LDLIBS = -lCom
USR_LDFLAGS = -L.
DEPLIBS_BASE = $(EPICS_BASE_LIB)
DEPLIBS = \
$(DEPLIBS_BASE)/libCom.a
SRCS.c = \
sf2dbYacc.c\
../sdr2gblmenu.c\
../sdr2driver.c\
../sdr2device.c\
../sdr2recordtype.c\
../dbStaticLib.c
OBJS = \
sdr2gblmenu.o \
sdr2driver.o \
sdr2device.o \
sdr2recordtype.o \
dbStaticLib.o
MAN1 = sf2db.1
PROD = sf2db sdr2gblmenu sdr2driver sdr2device sdr2recordtype
include $(EPICS)/config/RULES.Unix
sdr2gblmenu: sdr2gblmenu.o dbStaticLib.o
$(LINK.c) -o $@ sdr2gblmenu.o dbStaticLib.o $(LDLIBS)
sdr2driver: sdr2driver.o dbStaticLib.o
$(LINK.c) -o $@ sdr2driver.o dbStaticLib.o $(LDLIBS)
sdr2device: sdr2device.o dbStaticLib.o
$(LINK.c) -o $@ sdr2device.o dbStaticLib.o $(LDLIBS)
sdr2recordtype: sdr2recordtype.o dbStaticLib.o
$(LINK.c) -o $@ sdr2recordtype.o dbStaticLib.o $(LDLIBS)
sf2db: sf2dbYacc.o
$(LINK.c) -o $@ sf2dbYacc.o
sf2dbYacc.o: sf2dbLex.c
clean::
/bin/rm -f sf2dbYacc.c sf2dbLex.c

12
src/cvtDctsdr/Makefile.Vx Normal file
View File

@@ -0,0 +1,12 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
SRCS.c =
OBJS =
PROD =
include $(EPICS)/config/RULES.Vx

199
src/cvtDctsdr/choice.h Normal file
View File

@@ -0,0 +1,199 @@
/* $Id$
*
* Author: Marty Kraimer
* Date: 11-7-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:
* -----------------
* .01 05-18-92 rcz removed extern's
* .02 05-18-92 rcz New database access
*/
#ifndef INCchoiceh
#define INCchoiceh 1
struct choiceSet { /* This defines one set of choices*/
unsigned long number; /*number of choices */
char **papChoice;/*ptr to arr of ptr to choice string*/
};
struct arrChoiceSet{ /*An array of choice sets for particular record type*/
unsigned long number; /*number of choice sets */
struct choiceSet **papChoiceSet ;/*ptr to arr of ptr to choiceSet*/
};
struct choiceRec{ /*define choices for each record type*/
unsigned long number; /*number of arrChoiceSet */
struct arrChoiceSet **papArrChoiceSet;
/*ptr to arr of ptr to arrChoiceSet*/
};
/* device choices */
struct devChoice{
long link_type; /*link type for this device*/
char *pchoice; /*ptr to choice string */
};
struct devChoiceSet {
unsigned long number;
struct devChoice **papDevChoice;
char **papChoice;
};
struct devChoiceRec{ /*define device choices for each record type*/
unsigned long number; /*number of devChoiceSet */
struct devChoiceSet **papDevChoiceSet;
/*ptr to arr of ptr to devChoiceSet*/
};
/*NOTE: pchoiceCvt is initialized when cvtTable is loaded */
/* pchoiceDev is initialized when devSup is loaded */
/************************************************************************
* Except that entries could be null the following are valid references
* pchoiceCvt->papChoice[i]
* pchoiceGbl->papChoiceSet[i]->papChoice[j]
* pchoiceRec->papArrChoiceSet[i]->papChoiceSet[j]->papChoice[k]
* pchoiceDev->papDevChoiceSet[i]->papDevChoice[j]->pchoice->"<value>"
*
* The memory layout is
*
* pchoiceCvt->choiceSet
* number
* papChoice->[0]
* [1]->"<choice string>"
*
* pchoiceGbl->arrChoiceSet
* number
* papChoiceSet->[0]
* [1]->choiceSet
* number
* papChoice->[0]
* [1]->"<choice string>"
* pchoiceRec->choiceRec
* number
* papArrChoiceSet->[0]
* [1]->arrChoiceSet
* number
* papChoiceSet->[0]
* [1]->choiceSet
* number
* papChoice->[0]
* [1]->
*
* pchoiceDev->devChoiceRec
* number
* papDevChoiceSet->[0]
* [1]->devChoiceSet
* number
* papDevChoice->[0]
* [1]->devChoice
* link_type
* pchoice->"val"
*****************************************************************************/
/*************************************************************************
*The following macro returns NULL or a ptr to a string
* A typical usage is:
*
* char *pchoice;
* if(!(pchoice=GET_CHOICE(pchoiceSet,ind))){ <no string found>}
***************************************************************************/
#define GET_CHOICE(PCHOICE_SET,IND_CHOICE)\
(\
(PCHOICE_SET)\
?(\
( ((unsigned)(IND_CHOICE)>=((struct choiceSet*)(PCHOICE_SET))->number) )\
? NULL\
: ((PCHOICE_SET)->papChoice[(IND_CHOICE)])\
)\
: NULL\
)
/*****************************************************************************
* The following macro returns NULL or a ptr to a choiceSet structure
* A typical usage is:
*
* struct choiceSet *pchoiceSet;
* if(!(pchoiceSet=GET_PCHOICE_SET(parrChoiceSet,ind))){<null>}
***************************************************************************/
#define GET_PCHOICE_SET(PARR_CHOICE_SET,IND_ARR)\
(\
(PARR_CHOICE_SET)\
?(\
( ((unsigned)(IND_ARR)>=((struct arrChoiceSet*)(PARR_CHOICE_SET))->number) )\
? NULL\
: ((PARR_CHOICE_SET)->papChoiceSet[(IND_ARR)])\
)\
: NULL\
)
/*****************************************************************************
* The following macro returns NULL or a ptr to a arrChoiceSet structure
* A typical usage is:
*
* struct arrChoiceSet *parrChoiceSet;
* if(!(parrChoiceSet=GET_PARR_CHOICE_SET(pchoiceRec,ind))){<null>}
***************************************************************************/
#define GET_PARR_CHOICE_SET(PCHOICE_REC,IND_REC)\
(\
(PCHOICE_REC)\
?(\
( ((unsigned)(IND_REC)>=((struct choiceRec*)(PCHOICE_REC))->number) )\
? NULL\
: ((PCHOICE_REC)->papArrChoiceSet[(IND_REC)])\
)\
: NULL\
)
/*************************************************************************
*The following macro returns NULL or a ptr to a devChoice structure
* A typical usage is:
*
* struct devChoice *pdevChoice;
* if(!(pdevChoice=GET_DEV_CHOICE(pdevChoiceSet,ind))){ <not found>}
***************************************************************************/
#define GET_DEV_CHOICE(PDEV_CHOICE_SET,IND_CHOICE)\
(\
(PDEV_CHOICE_SET)\
?(\
( ((unsigned)(IND_CHOICE)>=((struct devChoiceSet*)(PDEV_CHOICE_SET))->number) )\
? NULL\
: ((PDEV_CHOICE_SET)->papDevChoice[(IND_CHOICE)])\
)\
: NULL\
)
/*****************************************************************************
* The following macro returns NULL or a ptr to a devChoiceSet structure
* A typical usage is:
*
* struct devChoiceSet *pdevChoiceSet;
* if(!(pdevChoiceSet=GET_PDEV_CHOICE_SET(pchoiceDev,ind))){<null>}
***************************************************************************/
#define GET_PDEV_CHOICE_SET(PCHOICE_DEV,IND_REC)\
(\
(PCHOICE_DEV)\
?(\
( ((unsigned)(IND_REC)>=((struct devChoiceRec*)(PCHOICE_DEV))->number) )\
? NULL\
: ((PCHOICE_DEV)->papDevChoiceSet[(IND_REC)])\
)\
: NULL\
)
#endif

46
src/cvtDctsdr/choiceGbl.h Normal file
View File

@@ -0,0 +1,46 @@
/* $Id$
*
* Author: Bob Zieman
* Date: 12-10-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:
* -----------------
* .01 12-13-91 jba Added GBL_PRIORITY
* .02 08-14-92 jba Added GBL_IVOA
*/
#ifndef INCchoiceGblh
#define INCchoiceGblh 1
#define GBL_YES_NO 0
#define GBL_SCAN 1
#define GBL_ALARM_SEV 2
#define GBL_ALARM_STAT 3
#define GBL_ARR_TYPE 4
#define GBL_OMSL 5
#define GBL_LINR 6
#define GBL_FTYPE 7
#define GBL_COMPRESS 8
#define GBL_PRIORITY 9
#define GBL_IVOA 10
#endif

94
src/cvtDctsdr/cvtTable.h Normal file
View File

@@ -0,0 +1,94 @@
/* $Id$
* Breakpoint Tables
*
* Author: Marty Kraimer
* Date: 11-7-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:
* -----------------
* .01 05-18-92 rcz removed extern
* .02 05-18-92 rcz new database access
* .03 08-19-92 jba add prototypes for cvtRawToEngBpt,cvtEngToRawBpt
*/
#ifndef INCcvtTableh
#define INCcvtTableh 1
#ifndef INCdbDefsh
#include "dbDefs.h"
#endif
struct brkInt{ /* breakpoint interval */
long raw; /*raw value for beginning of interval */
float slope; /*slope for interval */
float eng; /*converted value for beginning of interval*/
};
struct brkTable { /* breakpoint table */
char *name; /*breakpoint table name */
long number; /*number of brkInt in this table*/
long rawLow; /*lowest raw data value allowed */
long rawHigh; /*highest raw data value allowed*/
struct brkInt **papBrkInt; /* ptr to array of ptr to brkInt */
};
struct arrBrkTable { /* array of brkTable */
long number; /*number of break tables*/
struct brkTable **papBrkTable; /* ptr to array of ptr to brkTable*/
};
/***************************************************************************
* except that some fields could be null the following is a valid reference
* pcvtTable->papBrkTable[i]->papBrkInt[j]-><field>
*
* The memory layout is as follows:
*
* pcvtTable->arrBrkTable
* number
* papBrkTable->[0]=NULL
* [1]=NULL
* [2]->brkTable
* *name
* number
* papBrkInt->[0]
* [1]->brkInt
* raw
* slope
* eng
*****************************************************************************/
/* Global Routines*/
#ifdef __STDC__
long cvtEngToRawBpt(double *pval,short linr,short init,
void **ppbrk,short *plbrk);
long cvtRawToEngBpt(double *pval,short linr,short init,
void **ppbrk, short *plbrk);
#else
long cvtEngToRawBpt();
long cvtRawToEngBpt();
#endif /*__STDC__*/
#endif

91
src/cvtDctsdr/dbBase.h Normal file
View File

@@ -0,0 +1,91 @@
/* $Id$
*
* Current Author: Marty Kraimer
* Date: 03-19-92
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 03-19-92 mrk Original
* .02 05-18-92 rcz New database access
* .03 09-21-92 rcz removed #include <dbPvd.h>
*/
#ifndef INCdbBaseh
#define INCdbBaseh 1
#ifdef vxWorks
#ifndef INCchoiceh
#include <choice.h>
#endif
#ifndef INCcvtTableh
#include <cvtTable.h>
#endif
#ifndef INCdbDefsh
#include <dbDefs.h>
#endif
#ifndef INCdbRecDesh
#include <dbRecDes.h>
#endif
#ifndef INCdbRecTypeh
#include <dbRecType.h>
#endif
#ifndef INCdbRecordsh
#include <dbRecords.h>
#endif
#ifndef INCdevSuph
#include <devSup.h>
#endif
#ifndef INCdrvSuph
#include <drvSup.h>
#endif
#ifndef INCrecSuph
#include <recSup.h>
#endif
#endif /* vxWorks */
/******************************************************************
* Note: Functions dbFreeMem() and dbRead() must be kept in sync if
* struct dbBase changes.
******************************************************************/
struct dbBase {
struct choiceSet *pchoiceCvt;
struct arrChoiceSet *pchoiceGbl;
struct choiceRec *pchoiceRec;
struct devChoiceRec *pchoiceDev;
struct arrBrkTable *pcvtTable;
struct recDes *precDes;
struct recType *precType;
struct recHeader *precHeader;
struct recDevSup *precDevSup;
struct drvSup *pdrvSup;
struct recSup *precSup;
struct pvd *pdbPvd; /* DCT pvd - remove when DCT goes away */
void *ppvd;/* pointer to process variable directory*/
char *pdbName;/* pointer to database name*/
struct sdrSum *psdrSum;/* pointer to default sum */
long sdrFileSize; /*size of default.dctsdr file*/
long pvtSumFlag; /*internal use only*/
};
#endif

View File

@@ -0,0 +1,72 @@
/* $Id$
*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 mm-dd-yy iii Comment
*/
#ifndef INCdbFldTypesh
#define INCdbFldTypesh 1
/* field types */
#define DBF_STRING 0
#define DBF_CHAR 1
#define DBF_UCHAR 2
#define DBF_SHORT 3
#define DBF_USHORT 4
#define DBF_LONG 5
#define DBF_ULONG 6
#define DBF_FLOAT 7
#define DBF_DOUBLE 8
#define DBF_ENUM 9
#define DBF_GBLCHOICE 10
#define DBF_CVTCHOICE 11
#define DBF_RECCHOICE 12
#define DBF_DEVCHOICE 13
#define DBF_INLINK 14
#define DBF_OUTLINK 15
#define DBF_FWDLINK 16
#define DBF_NOACCESS 17
#define DBF_NTYPES DBF_NOACCESS+1
/* data request buffer types */
#define DBR_STRING DBF_STRING
#define DBR_CHAR DBF_CHAR
#define DBR_UCHAR DBF_UCHAR
#define DBR_SHORT DBF_SHORT
#define DBR_USHORT DBF_USHORT
#define DBR_LONG DBF_LONG
#define DBR_ULONG DBF_ULONG
#define DBR_FLOAT DBF_FLOAT
#define DBR_DOUBLE DBF_DOUBLE
#define DBR_ENUM DBF_ENUM
#define DBR_PUT_ACKT DBR_ENUM+1
#define DBR_PUT_ACKS DBR_PUT_ACKT+1
#define DBR_NOACCESS DBF_NOACCESS
#define VALID_DB_REQ(x) ((x >= 0) && (x <= DBR_PUT_ACKS))
#define INVALID_DB_REQ(x) ((x < 0) || (x > DBR_PUT_ACKS))
#endif /*INCdbFldTypesh*/

163
src/cvtDctsdr/dbRecDes.h Normal file
View File

@@ -0,0 +1,163 @@
/* $Id$
*
* Original Author: Bob Dalesio
* Current Author: Marty Kraimer
* 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:
* -----------------
* .01 mm-dd-yy iii Comment
* .02 05-18-92 rcz removed extern
* .03 05-18-92 rcz changed macro "GET_PRECTYPDES(" to "GET_PRECTYPDES(precDes,"
* .04 05-18-92 rcz New database access
* .05 08-12-92 jba Removed dbr_field_type from struct fldDes
* .06 09-15-92 jba added short pad field to fldDes
* .07 06-23-93 mrk Moved pad so that fldname is NULL terminated
*/
#ifndef INCdbRecDesCT
#define INCdbRecDesCT
/* conversion types*/
#define CT_DECIMAL 0
#define CT_HEX 1
/* lowfl, highfl */
#define CON 0
#define VAR 1
/* access level types */
#define ASL0 0
#define ASL1 1
#endif
#ifndef INCdbRecDesh
#define INCdbRecDesh
#define PROMPT_SZ 24
union fld_types{
char char_value;
unsigned char uchar_value;
short short_value;
unsigned short ushort_value;
long long_value;
unsigned long ulong_value;
float float_value;
double double_value;
unsigned short enum_value;
};
struct range {
long fldnum;
long pad;
union fld_types value;
};
struct fldDes{ /* field description */
char prompt[PROMPT_SZ]; /*Prompt string for DCT*/
char fldname[FLDNAME_SZ];/*field name */
short fldnamePad; /*make sure fldname is NULL termated */
short offset; /*Offset in bytes from beginning of record*/
short size; /*length in bytes of a field element */
short special; /*Special processing requirements */
short field_type; /*Field type as defined in dbFldTypes.h */
short process_passive;/*should dbPutField process passive */
short choice_set; /*index of choiceSet GBLCHOICE & RECCHOICE*/
short cvt_type; /*Conversion type for DCT */
short promptflag; /*Does DCT display this field */
short lowfl; /*Is range1 CON or VAR */
short highfl; /*Is range2 CON or VAR */
short interest; /*interest level */
short as_level; /*access security level */
short pad2;
union fld_types initial;/*initial value */
struct range range1; /*Low value for field (Used by DCT) */
struct range range2; /*High value for field (Used by DCT) */
};
struct recTypDes{ /* record type description */
short rec_size; /* size of the record */
short no_fields; /* number of fields defined */
short no_prompt; /* number of fields to configure*/
short no_links; /* number of links */
short *link_ind; /* addr of array of ind in apFldDes*/
unsigned long *sortFldName; /* addr of array of sorted fldname*/
short *sortFldInd; /* addr of array of ind in apFldDes*/
struct fldDes **papFldDes; /* ptr to array of ptr to fldDes*/
};
struct recDes{ /* record description */
long number; /*number of recTypDes*/
struct recTypDes **papRecTypDes;/*ptr to arr of ptr to recTypDes*/
};
/***************************************************************************
* Except that some ptr could be NULL the following is a valid reference
* precDes->papRecTypDes[i]->papFldDes[j]-><field>
*
* The memory layout is as follows:
*
* precDes->recDes
* number
* papRecTypDes->[1]
* [2]->papFldDes->[0]
* [1]->fldDes
* prompt
* fldname
* ...
*
* sortFldName[*] is a sorted array of blank padded fieldnames
* that can be interpeted as a long which must be 32 bits
* Note that FLDNAME_SZ MUST be 4
* sortFldInd[*] is an array of indices for sortFldName.
* Each element of this array is an index into papFldDes[*].
*****************************************************************************/
/*****************************************************************************
* The following macro returns NULL or a ptr to a fldDes structure
* A typical usage is:
*
* struct fldDes *pfldDes;
* if(!(pfldDes=GET_PFLDDES(precTypDes,ind)
****************************************************************************/
#define GET_PFLDDES(PRECTYPDES,IND_FLD)\
(\
(PRECTYPDES)\
?(\
( ((IND_FLD)<0) ||\
((IND_FLD)>=((struct recTypDes *)(PRECTYPDES))->no_fields) )\
? NULL\
: (((struct recTypDes *)(PRECTYPDES))->papFldDes[(IND_FLD)])\
)\
: NULL\
)
/*****************************************************************************
* The following macro returns NULL or a ptr to a recTypDes structure
* A typical usage is:
*
* struct recTypDes *precTypDes;
* if(!(precTypDes=GET_PRECTYPDES(precDes,ind);
****************************************************************************/
#define GET_PRECTYPDES(PRECDES,IND_REC)\
(\
(PRECDES)\
?(\
( ((IND_REC)<1) || ((IND_REC)>=(PRECDES)->number) )\
? NULL\
: ((PRECDES)->papRecTypDes[(IND_REC)])\
)\
: NULL\
)
#endif

72
src/cvtDctsdr/dbRecType.h Normal file
View File

@@ -0,0 +1,72 @@
/* $Id$
*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 05-18-92 rcz removed extern
* .02 05-18-92 rcz Changed GET_PRECTYPE to GET_PRECNAME
* .03 05-18-92 rcz New database access (removed extern)
*/
#ifndef INCdbRecTypeh
#define INCdbRecTypeh 1
struct recType {
long number; /*number of types */
char **papName; /*ptr to arr of ptr to name */
};
#define S_rectype_noRecs (M_recType| 3) /*No record types are defined*/
/*************************************************************************
* Except that some entries may be null the following is valid access
*
* precType->papName[i]
*
* The memory layout is
*
* precType->papName[1]->"ai"
* [2]->"ao"
**************************************************************************/
/**************************************************************************
* The following macro returns NULL or a ptr to the rectype string
* A typical usage is:
*
* char *pstr;
* if(!(pstr=GET_PRECNAME(precType,type))) {<null>}
**************************************************************************/
#define GET_PRECNAME(PRECTYPE,REC_TYPE)\
(\
(PRECTYPE)\
?(\
( ((REC_TYPE)<1) || ((REC_TYPE)>=(PRECTYPE)->number) )\
? NULL\
: ((PRECTYPE)->papName[(REC_TYPE)])\
)\
: NULL\
)
#endif

104
src/cvtDctsdr/dbRecords.h Normal file
View File

@@ -0,0 +1,104 @@
/* $Id$
*
* Record Location
*
* Original Author: Bob Dalesio
* Current Author: Marty Kraimer
* 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:
* -----------------
* .01 mm-dd-yy iii Comment
* .02 03-26-92 mrk added pvdPvt private field for pvd routines
* .03 04-10-92 rcz changed pvdPvt to pList
* .04 05-18-92 rcz removed extern
* .05 05-18-92 rcz Changed macro call "GET_PRECLOC(" to "GET_PRECLOC(precHeader,"
* .06 06-01-92 rcz Moved struct RECNODE
* .07 06-08-92 rcz Changed pList to preclist
* .08 06-08-92 rcz New database access
*/
#ifndef INCdbRecordsh
#define INCdbRecordsh 1
#include <ellLib.h>
struct recLoc{ /* record location*/
long no_records; /*OBSOLETE DO NOT USE*/
long no_used; /*OBSOLETE DO NOT USE*/
long rec_size; /*record size in bytes */
long record_type; /*record type */
void *pFirst; /*OBSOLETE DO NOT USE*/
ELLLIST *preclist; /*LIST head of sorted RECNODEs */
};
struct recHeader{ /*record header*/
long number; /*number of record types*/
struct recLoc **papRecLoc; /*ptr to arr of ptr to recLoc*/
};
#define S_record_noRecords (M_record| 1) /*No records */
/***********************************************************************
* Except that some ptr could be null the following is a valid reference
*
* precHeader->papRecLoc[i]->preclist
*
* The memory layout is:
*
* precHeader->recHeader
* number
* papRecLoc->[1]
* [2]->recLoc
* rec_type
* pRECLIST-----> LIST---->RECNODE ...
************************************************************************/
/************************************************************************
* In the self defining record the following appears
*
* sdrHeader
* recLoc
* record 1
* ...
* record n (n = recLoc.no_records
**************************************************************************/
/************************************************************************
* The following macro returns NULL or a ptr to struct recLoc
* A typical usage is:
*
* struct recLoc *precLoc
* if(!(precLoc=GET_PRECLOC(precHeader,type))) {<not found>}
***********************************************************************/
#define GET_PRECLOC(PRECHEADER,REC_TYPE)\
(\
(PRECHEADER)\
?(\
( ((REC_TYPE)<1) || ((REC_TYPE)>=(PRECHEADER)->number) )\
? NULL\
: ((PRECHEADER)->papRecLoc[(REC_TYPE)])\
)\
: NULL\
)
#endif

View File

@@ -4127,16 +4127,16 @@ FILE *fp;
}
/* Beginning of Process Variable Directory Routines*/
#define HASH_NO 512 /* number of hash table entries */
#define HASH_NO 2048 /* number of hash table entries */
#define SHIFT 3 /*number of bits to shift*/
/*The hash algorithm is a modification of the algorithm described in */
/* Fast Hashing of Variable Length Text Strings, Peter K. Pearson, */
/* Communications of the ACM, June 1990 */
/* The modifications were desdigned by Marty Kraimer and Ben Chin Cha */
/* The mods were implemented and tested by Ben Chin Cha */
/* The modifications were designed by Marty Kraimer */
static unsigned char T0[256] = {
static unsigned char T[256] = {
39,159,180,252, 71, 6, 13,164,232, 35,226,155, 98,120,154, 69,
157, 24,137, 29,147, 78,121, 85,112, 8,248,130, 55,117,190,160,
176,131,228, 64,211,106, 38, 27,140, 30, 88,210,227,104, 84, 77,
@@ -4155,45 +4155,24 @@ static unsigned char T0[256] = {
134, 68, 93,183,241, 81,196, 49,192, 65,212, 94,203, 10,200, 47
};
static unsigned char T1[256] = {
9,139,209, 40, 31,202, 58,179,116, 33,207,146, 76, 60,242,124,
254,197, 80,167,153,145,129,233,132, 48,246, 86,156,177, 36,187,
45, 1, 96, 18, 19, 62,185,234, 99, 16,218, 95,128,224,123,253,
42,109, 4,247, 72, 5,151,136, 0,152,148,127,204,133, 17, 14,
182,217, 54,199,119,174, 82, 57,215, 41,114,208,206,110,239, 23,
189, 15, 3, 22,188, 79,113,172, 28, 2,222, 21,251,225,237,105,
102, 32, 56,181,126, 83,230, 53,158, 52, 59,213,118,100, 67,142,
220,170,144,115,205, 26,125,168,249, 66,175, 97,255, 92,229, 91,
214,236,178,243, 46, 44,201,250,135,186,150,221,163,216,162, 43,
11,101, 34, 37,194, 25, 50, 12, 87,198,173,240,193,171,143,231,
111,141,191,103, 74,245,223, 20,161,235,122, 63, 89,149, 73,238,
134, 68, 93,183,241, 81,196, 49,192, 65,212, 94,203, 10,200, 47,
39,159,180,252, 71, 6, 13,164,232, 35,226,155, 98,120,154, 69,
157, 24,137, 29,147, 78,121, 85,112, 8,248,130, 55,117,190,160,
176,131,228, 64,211,106, 38, 27,140, 30, 88,210,227,104, 84, 77,
75,107,169,138,195,184, 70, 90, 61,166, 7,244,165,108,219, 51,
};
#ifdef __STDC__
static unsigned short hash( char *pname, int length)
#else
static unsigned short hash( pname, length)
char *pname;
int length;
#endif /*__STDC__*/
{
unsigned short h=0;
unsigned short hret;
unsigned char *h0=(unsigned char *)&h;
unsigned char *h1= h0 + 1;
unsigned char h0=0;
unsigned char h1=0;
unsigned short ind0,ind1;
int even = TRUE;
unsigned char c;
int i;
for(i=0; i<length; i+=2, pname+=2) {
*h0 = T0[*h0 ^ *pname];
*h1 = T1[*h1 ^ *(pname+1)];
for(i=0; i<length; i++, pname++) {
c = *pname;
if(even) {h0 = T[h0^c]; even = FALSE;}
else {h1 = T[h1^c]; even = TRUE;}
}
hret = *h0;
return(hret + *h1);
ind0 = (unsigned short)h0;
ind1 = (unsigned short)h1;
return((ind1<<SHIFT) ^ ind0);
}
#ifdef __STDC__

282
src/cvtDctsdr/dbStaticLib.h Normal file
View File

@@ -0,0 +1,282 @@
/* $Id$
*
* Author: Marty Kraimer
* Date: 06-08-93
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 06-08-93 mrk Replace dbManipulate
*/
#ifndef INCdbStaticLibh
#define INCdbStaticLibh 1
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
#include <ellLib.h>
#include <dbDefs.h>
#include <dbRecords.h>
#include <dbRecType.h>
#include <dbFldTypes.h>
#include <dbRecDes.h>
#include <choice.h>
#include <dbBase.h>
#include <link.h>
#include <errMdef.h>
/*Field types as seen by static database access clients*/
#define DCT_STRING 0
#define DCT_INTEGER 1
#define DCT_REAL 2
#define DCT_MENU 3
#define DCT_MENUFORM 4
#define DCT_INLINK 5
#define DCT_OUTLINK 6
#define DCT_FWDLINK 7
#define DCT_NOACCESS 8
/*Link types as seen by static database access clients*/
#define DCT_LINK_CONSTANT 0
#define DCT_LINK_FORM 1
#define DCT_LINK_PV 2
#define DCT_LINK_DEVICE 3
/* conversion types for DBFLDDES.cvt_type*/
#define CT_DECIMAL 0
#define CT_HEX 1
/*options for dbRead and dbWrite*/
#define DB_RECDES_IO 0x1
#define DB_RECORD_IO 0x2
typedef struct dbBase DBBASE;
typedef struct recNode {
ELLNODE node;
void *precord;
}RECNODE;
typedef struct{
DBBASE *pdbbase;
RECNODE *precnode;
struct fldDes *pflddes;
void *pfield;
char *message;
short record_type;
short indfield;
void *formpvt;
} DBENTRY;
/*directory*/
typedef struct{
ELLNODE node;
unsigned short record_type;
RECNODE *precnode;
} PVDENTRY;
/* Static database access routines*/
#if defined(__STDC__) || defined(__cplusplus)
void * dbCalloc(size_t nobj,size_t size);
void * dbMalloc(size_t size);
DBBASE *dbAllocBase(void);
void dbFreeBase(DBBASE *pdbbase);
DBENTRY *dbAllocEntry(DBBASE *pdbbase);
void dbFreeEntry(DBENTRY *pdbentry);
void dbInitEntry(DBBASE *pdbbase,DBENTRY *pdbentry);
void dbFinishEntry(DBENTRY *pdbentry);
DBENTRY *dbCopyEntry(DBENTRY *pdbentry);
long dbRead(DBBASE *pdbbase,FILE *fp);
long dbWrite(DBBASE *pdbbase,FILE *fpdctsdr,FILE *fp);
long dbFindRecdes(DBENTRY *pdbentry,char *recdesname);
long dbFirstRecdes(DBENTRY *pdbentry);
long dbNextRecdes(DBENTRY *pdbentry);
char *dbGetRecdesName(DBENTRY *pdbentry);
int dbGetNRecdes(DBENTRY *pdbentry);
long dbCopyRecdes(DBENTRY *from,DBENTRY *to);
long dbCreateRecord(DBENTRY *pdbentry,char *precordName);
long dbDeleteRecord(DBENTRY *pdbentry);
long dbFindRecord(DBENTRY *pdbentry,char *precordName);
long dbFirstRecord(DBENTRY *pdbentry); /*first of record type*/
long dbNextRecord(DBENTRY *pdbentry);
int dbGetNRecords(DBENTRY *pdbentry);
char *dbGetRecordName(DBENTRY *pdbentry);
long dbRenameRecord(DBENTRY *pdbentry,char *newName);
long dbCopyRecord(DBENTRY *from,DBENTRY *to);
long dbFindField(DBENTRY *pdbentry,char *pfieldName);
long dbFirstFielddes(DBENTRY *pdbentry,int dctonly);
long dbNextFielddes(DBENTRY *pdbentry,int dctonly);
int dbGetFieldType(DBENTRY *pdbentry);
int dbGetNFields(DBENTRY *pdbentry,int dctonly);
char *dbGetFieldName(DBENTRY *pdbentry);
char *dbGetPrompt(DBENTRY *pdbentry);
int dbGetPromptGroup(DBENTRY *pdbentry);
char *dbGetString(DBENTRY *pdbentry);
long dbPutString(DBENTRY *pdbentry,char *pstring);
char *dbVerify(DBENTRY *pdbentry,char *pstring);
char *dbGetRange(DBENTRY *pdbentry);
int dbIsDefaultValue(DBENTRY *pdbentry);
char **dbGetChoices(DBENTRY *pdbentry);
int dbGetMenuIndex(DBENTRY *pdbentry);
long dbPutMenuIndex(DBENTRY *pdbentry,int index);
int dbGetNMenuChoices(DBENTRY *pdbentry);
long dbCopyMenu(DBENTRY *from,DBENTRY *to);
int dbAllocForm(DBENTRY *pdbentry);
long dbFreeForm(DBENTRY *pdbentry);
char **dbGetFormPrompt(DBENTRY *pdbentry);
char **dbGetFormValue(DBENTRY *pdbentry);
long dbPutForm(DBENTRY *pdbentry,char **value);
char **dbVerifyForm(DBENTRY *pdbentry,char **value);
int dbGetNLinks(DBENTRY *pdbentry);
long dbGetLinkField(DBENTRY *pdbentry,int index);
int dbGetLinkType(DBENTRY *pdbentry);
long dbCvtLinkToConstant(DBENTRY *pdbentry);
long dbCvtLinkToPvlink(DBENTRY *pdbentry);
long dbPutPvlink(DBENTRY *pdbentry,int pp,int ms,char *pvname);
long dbGetPvlink(DBENTRY *pdbentry,int *pp,int *ms,char *pvname);
/*dump routines*/
void dbDumpRecords(DBBASE *pdbbase,char *precdesname,int modOnly);
void dbDumpPvd(DBBASE *pdbbase);
void dbReportDeviceConfig(DBBASE *pdbbase,FILE *report);
/* Misc useful routines*/
/*general purpose allocation routines to invoke calloc and maloc */
/* NOTE: These routines do NOT return if they fail. */
void *dbCalloc(size_t nobj,size_t size);
void *dbMalloc(size_t size);
/* The following routines should only be used by access routines*/
void dbPvdInitPvt(DBBASE *pdbbase);
PVDENTRY *dbPvdFind(DBBASE *pdbbase,char *name,int lenname);
PVDENTRY *dbPvdAdd(DBBASE *pdbbase,unsigned short record_type,RECNODE *precnode);
void dbPvdDelete(DBBASE *pdbbase,RECNODE *precnod);
void dbPvdFreeMem(DBBASE *pdbbase);
void dbPvdDump(DBBASE *pdbbase);
#else
void * dbCalloc();
void * dbMalloc();
DBBASE *dbAllocBase();
void dbFreeBase();
DBENTRY *dbAllocEntry();
void dbFreeEntry();
void dbInitEntry();
void dbFinishEntry();
DBENTRY *dbCopyEntry();
long dbRead();
long dbWrite();
long dbFindRecdes();
long dbFirstRecdes();
long dbNextRecdes();
char *dbGetRecdesName();
int dbGetNRecdes();
long dbCopyRecdes();
long dbCreateRecord();
long dbDeleteRecord();
long dbFindRecord();
long dbFirstRecord();
long dbNextRecord();
int dbGetNRecords();
char *dbGetRecordName();
long dbRenameRecord();
long dbCopyRecord();
long dbFindField();
long dbFirstFielddes();
long dbNextFielddes();
int dbGetFieldType();
int dbGetNFields();
char *dbGetFieldName();
char *dbGetPrompt();
char *dbGetString();
long dbPutString();
char *dbVerify();
char *dbGetRange();
int dbIsDefaultValue();
char **dbGetChoices();
int dbGetMenuIndex();
long dbPutMenuIndex();
int dbGetNMenuChoices();
long dbCopyMenu();
int dbAllocForm();
long dbFreeForm();
char **dbGetFormPrompt();
char **dbGetFormValue();
long dbPutForm();
char **dbVerifyForm();
int dbGetNLinks();
long dbGetLinkField();
int dbGetLinkType();
long dbCvtLinkToConstant();
long dbCvtLinkToPvlink();
long dbPutPvlink();
long dbGetPvlink();
/*dump routines*/
void dbDumpRecords();
void dbDumpPvd();
/* Misc useful routines*/
/*general purpose allocation routines to invoke calloc and maloc */
/* NOTE: These routines do NOT return if they fail. */
void *dbCalloc();
void *dbMalloc();
/* The following routines should only be used by access routines*/
void dbPvdInitPvt();
PVDENTRY *dbPvdFind();
PVDENTRY *dbPvdAdd();
void dbPvdDelete();
void dbPvdFreeMem();
void dbPvdDump();
#endif /*__STDC__*/
#define S_dbLib_recdesNotFound (M_dbLib| 1) /*Record Type does not exist*/
#define S_dbLib_recExists (M_dbLib| 3) /*Record Already exists*/
#define S_dbLib_recNotFound (M_dbLib| 5) /*Record Not Found*/
#define S_dbLib_flddesNotFound (M_dbLib| 7) /*Field Description Not Found*/
#define S_dbLib_fieldNotFound (M_dbLib| 9) /*Field Not Found*/
#define S_dbLib_badField (M_dbLib|11) /*Bad Field value*/
#define S_dbLib_menuNotFound (M_dbLib|13) /*Menu not found*/
#define S_dbLib_badLink (M_dbLib|15) /*Bad Link Field*/
#define S_dbLib_nameLength (M_dbLib|17) /*Record Name is too long*/
#endif /*INCdbStaticLibh*/

133
src/cvtDctsdr/devSup.h Normal file
View File

@@ -0,0 +1,133 @@
/* devSup.h Device Support */
/* share/epicsH $Id$ */
/*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 10-04-91 jba Added error message
* .02 05-18-92 rcz Changed macro "GET_DEVSUP(" to "GET_PDEVSUP(precDevSup,"
* .03 05-18-92 rcz Structure devSup changed element name from dsetName to papDsetName
* .04 05-18-92 rcz New database access
*/
#ifndef INCdevSuph
#define INCdevSuph 1
#ifdef __cplusplus
typedef long (*DEVSUPFUN)(void*); /* ptr to device support function*/
#else
typedef long (*DEVSUPFUN)(); /* ptr to device support function*/
#endif
struct dset { /* device support entry table */
long number; /*number of support routines*/
DEVSUPFUN report; /*print report*/
DEVSUPFUN init; /*init support*/
DEVSUPFUN init_record; /*init support for particular record*/
DEVSUPFUN get_ioint_info; /* get io interrupt information*/
/*other functions are record dependent*/
};
struct devSup {
long number; /*number of dset */
char **papDsetName; /*ptr of arr of ptr to name */
struct dset **papDset; /*ptr to arr of ptr to dset */
};
struct recDevSup {
long number; /*number of record types */
struct devSup **papDevSup; /*ptr to arr of ptr to devSup */
};
#define S_dev_noDevSup (M_devSup| 1) /*SDR_DEVSUP: Device support missing*/
#define S_dev_noDSET (M_devSup| 3) /*Missing device support entry table*/
#define S_dev_missingSup (M_devSup| 5) /*Missing device support routine*/
#define S_dev_badInpType (M_devSup| 7) /*Bad INP link type*/
#define S_dev_badOutType (M_devSup| 9) /*Bad OUT link type*/
#define S_dev_badInitRet (M_devSup|11) /*Bad init_rec return value */
#define S_dev_badBus (M_devSup|13) /*Illegal bus type*/
#define S_dev_badCard (M_devSup|15) /*Illegal or nonexistant module*/
#define S_dev_badSignal (M_devSup|17) /*Illegal signal*/
#define S_dev_NoInit (M_devSup|19) /*No init*/
#define S_dev_Conflict (M_devSup|21) /*Multiple records accessing same signal*/
/***************************************************************************
* except that some fields could be null the following is a valid reference
*
* precDevSup->papDevSup[i]->papDset[j]->report(<args>);
*
* The memory layout is
*
* precDevSup->recDevSup
* number
* papDevSup->[1]
* [2]->devSup
* number
* papDsetName->[0]->"name"
* papDset-->[0]
* [1]->dset
* number
* report->report()
* ...
***************************************************************************/
/***************************************************************************
* The following macro returns NULL or ptr to struct devSup
* A typical usage is:
*
* struct devSup *pdevSup;
* if(!(pdevSup=GET_PDEVSUP(precDevSup,rectype))) {<null>}
**************************************************************************/
#define GET_PDEVSUP(PRECDEVSUP,REC_TYPE)\
(\
(PRECDEVSUP)\
?(\
( ((REC_TYPE)<1) || ((REC_TYPE)>=(PRECDEVSUP)->number) )\
? NULL\
: ((PRECDEVSUP)->papDevSup[(REC_TYPE)])\
)\
: NULL\
)
/***************************************************************************
* The following macro returns NULL of ptr to struct dset
* A typical usage is:
*
* struct dset *pdset;
* if(!(pdset=GET_PDSET(pdevSup,dtyp))) {<null>}
**************************************************************************/
#define GET_PDSET(PDEVSUP,DTYP)\
(\
(PDEVSUP)\
?(\
( (((unsigned)DTYP)>=((struct devSup*)(PDEVSUP))->number) )\
? NULL\
: ( ((struct devSup*)(PDEVSUP))->papDset[(DTYP)] )\
)\
: NULL\
)
#endif

112
src/cvtDctsdr/drvSup.h Normal file
View File

@@ -0,0 +1,112 @@
/* drvSup.h Driver Support */
/* share/epicsH $Id$ */
/*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 05-21-92 rcz changed drvetName to papDrvName
* .02 05-18-92 rcz New database access (removed extern)
*/
#ifndef INCdrvSuph
#define INCdrvSuph 1
typedef long (*DRVSUPFUN) (); /* ptr to driver support function*/
struct drvet { /* driver entry table */
long number; /*number of support routines*/
DRVSUPFUN report; /*print report*/
DRVSUPFUN init; /*init support*/
DRVSUPFUN reboot; /*reboot support*/
/*other functions are device dependent*/
};
struct drvSup {
long number; /*number of dset */
char **papDrvName; /*ptr to arr of ptr to drvetName*/
struct drvet **papDrvet; /*ptr to arr ptr to drvet */
};
#define DRVETNUMBER ( (sizeof(struct drvet) -sizeof(long))/sizeof(DRVSUPFUN) )
#define S_drv_noDrvSup (M_drvSup| 1) /*SDR_DRVSUP: Driver support missing*/
#define S_drv_noDrvet (M_drvSup| 3) /*Missing driver support entry table*/
/**************************************************************************
*
*The following are valid references
*
* pdrvSup->drvetName[i] This is address of name string
* pdrvSup->papDrvet[i]->report(<args>);
*
* The memory layout is
*
* pdrvSup->drvSup
* number
* papDrvName->[0]->"name"
* papDrvet-->[0]
* [1]->drvet
* number
* report->report()
* ...
*************************************************************************/
/**************************************************************************
* The following macro returns either the addr of drvet or NULL
* A typical usage is:
*
* struct drvet *pdrvet;
* if(!(pdrvet=GET_PDRVET(pdrvSup,type))) {<null}
***********************************************************************/
#define GET_PDRVET(PDRVSUP,TYPE)\
(\
PDRVSUP\
?(\
(((TYPE) < 1) || ((TYPE) >= PDRVSUP->number))\
? NULL\
: (PDRVSUP->papDrvet[(TYPE)])\
)\
: NULL\
)
/**************************************************************************
* The following macro returns either the addr of drvName or NULL
* A typical usage is:
*
* char *pdrvName;
* if(!(pdrvName=GET_PDRVNAME(pdrvSup,type))) {<null}
***********************************************************************/
#define GET_PDRVNAME(PDRVSUP,TYPE)\
(\
PDRVSUP\
?(\
(((TYPE) < 1) || ((TYPE) >= PDRVSUP->number))\
? NULL\
: (PDRVSUP->papDrvName[(TYPE)])\
)\
: NULL\
)
#endif

118
src/cvtDctsdr/errMdef.h Normal file
View File

@@ -0,0 +1,118 @@
/* errMdef.h err.h - Error Handling definitions */
/* share/epicsH $Id$ */
/*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 mm-dd-yy iii Comment
* .02 12-02-91 jrw added GPIB and BB message codes
* .03 03-11-93 joh added __FILE__ and __LINE__ to errMessage()
* .04 04-01-93 joh added vxi
* .05 04-29-93 joh added errPrintStatus() func proto
* .06 09-04-93 rcz added functions ... for errSymLib.c merge
* .07 02-03-94 mrk RTN_SUCCESS is true only if status=0
* .08 02-03-94 mrk Add access security library
* .09 05-23-95 joh Add bucket hashing library
*/
#ifndef INCerrMdefh
#define INCerrMdefh
#ifdef __STDC__
# include <stdarg.h>
#else
# include <varargs.h>
#endif
#include <ellLib.h>
#define RTN_SUCCESS(STATUS) ((STATUS)==0)
#define M_dbAccess (501 <<16) /*Database Access Routines */
#define M_sdr (502 <<16) /*Self Defining Records */
#define M_drvSup (503 <<16) /*Driver Support*/
#define M_devSup (504 <<16) /*Device Support*/
#define M_recSup (505 <<16) /*Record Support*/
#define M_recType (506 <<16) /*Record Type*/
#define M_record (507 <<16) /*Database Records*/
#define M_ar (508 <<16) /*Archiver; see arDefs.h*/
#define M_ts (509 <<16) /*Time Stamp Routines; see tsDefs.h*/
#define M_arAcc (510 <<16) /*Archive Access Library Routines*/
#define M_bf (511 <<16) /*Block File Routines; see bfDefs.h*/
#define M_syd (512 <<16) /*Sync Data Routines; see sydDefs.h*/
#define M_ppr (513 <<16) /*Portable Plot Routines; see pprPlotDefs.h*/
#define M_env (514 <<16) /*Environment Routines; see envDefs.h*/
#define M_gen (515 <<16) /*General Purpose Routines; see genDefs.h*/
#define M_gpib (516 <<16) /*Gpib driver & device support; see drvGpibInterface.h*/
#define M_bitbus (517 <<16) /*Bitbus driver & device support; see drvBitBusInterface.h*/
#define M_dbCa (518 <<16) /*CA_LINKs; see calink.h*/
#define M_dbLib (519 <<16) /*Static Database Access */
#define M_epvxi (520 <<16) /*VXI Driver*/
#define M_devLib (521 <<16) /*Device Resource Registration*/
#define M_asLib (522 <<16) /*Access Security */
#define M_cas (523 <<16) /*CA server*/
#define M_casApp (524 <<16) /*CA server application*/
#define M_bucket (525 <<16) /*Bucket Hash*/
#define M_sbuf (526 <<16) /*Shared Buffer*/
/*
* redefine errMessage with a macro so we can print
* the file and line number
*/
#define errMessage(S, PM) \
errPrintf(S, __FILE__, __LINE__, PM)
#ifdef __STDC__
int errSymFind(long status, char *name);
int UnixSymFind(long status, char *name, long *value);
int ModSymFind(long status, char *name, long *value);
void errSymTest(unsigned short modnum, unsigned short begErrNum, unsigned short endErrNum);
void errSymTestPrint(long errNum);
int errSymBld();
int errSymbolAdd (long errNum,char *name);
void errPrintf(long status, const char *pFileName,
int lineno, const char *pformat, ...);
void errSymDump();
void tstErrSymFind();
void errInit(void);
#else /*__STDC__*/
void errSymTest();
int errSymFind();
int UnixSymFind();
int ModSymFind();
void errSymTestPrint();
int errSymBld();
int errSymbolAdd();
void errPrintf();
void errSymDump();
void tstErrSymFind();
#endif /*__STDC__*/
extern int errVerbose;
#endif /*INCerrMdefh*/

189
src/cvtDctsdr/link.h Normal file
View File

@@ -0,0 +1,189 @@
/* link.h */
/* base/include $Id$ */
/*
* Original Author: Bob Dalesio
* Current Author: Marty Kraimer
* 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:
* -----------------
* .01 12-18-91 jba Changed caddr_t to void *
* .02 3-16-92 frl changed link.value.value to double
* .03 9-9-92 frl added vxi link type
* .04 12-13-93 mcn added conversion pointer for fast links
* .05 1-10-95 jt added rf_io structure
*/
#include <dbDefs.h>
/* link types */
#ifndef INClinkLT
#define INClinkLT
#define CONSTANT 0
#define PV_LINK 1
#define VME_IO 2
#define CAMAC_IO 3
#define AB_IO 4
#define GPIB_IO 5
#define BITBUS_IO 6
#define DB_LINK 10
#define CA_LINK 11
#define INST_IO 12 /* instrument */
#define BBGPIB_IO 13 /* bitbus -> gpib */
#define RF_IO 14
#define VXI_IO 15
#endif /*INClinkLT*/
#ifndef INClinkh
#define INClinkh 1
#define INSTIO_FLD_SZ 36 /* field size for instio */
#define LINK_PARAM_SZ 32
#define VME_PARAM_SZ 32
#define AB_PARAM_SZ 26
#define CAMAC_PARAM_SZ 26
#define VXI_PARAM_SZ 26
#define VXIDYNAMIC 0
#define VXISTATIC 1
/* structure of a link to a process variable*/
struct pv_link {
short process_passive; /* should in/out passive link be processed*/
short maximize_sevr; /* maximize sevr of link. stat=LINK_ALARM*/
char pvname[PVNAME_SZ+1];
char pad[3];
char fldname[FLDNAME_SZ];
};
/* structure of a link to a database link */
struct db_link {
short process_passive; /* should in/out passive link be processed */
short maximize_sevr; /* maximize sevr of link. stat=LINK_ALARM */
void *pdbAddr; /* pointer to database address structure */
long (*conversion)(); /* conversion routine for fast links */
};
/* structure of a VME io channel */
struct vmeio {
short card;
short signal;
char parm[VME_PARAM_SZ];
};
/* structure of a CAMAC io channel */
struct camacio {
short b;
short c;
short n;
short a;
short f;
char parm[CAMAC_PARAM_SZ];
};
/* structure of a RF io channel */
struct rfio {
short branch;
short cryo;
short micro;
short dataset;
short element;
long ext;
};
/* structure of a Allen-Bradley io channel */
struct abio {
short link;
short adapter;
short card;
short signal;
short plc_flag;
char parm[AB_PARAM_SZ];
};
/* structure of a gpib io channel */
struct gpibio {
short link;
short addr; /* device address */
char parm[LINK_PARAM_SZ];
};
/* structure of a bitbus io channel */
struct bitbusio {
unsigned char link;
unsigned char node;
unsigned char port;
unsigned char signal;
char parm[LINK_PARAM_SZ];
};
/* structure of a bitbus to gpib io channel */
struct bbgpibio {
unsigned char link;
unsigned char bbaddr;
unsigned char gpibaddr;
unsigned char pad;
char parm[LINK_PARAM_SZ];
};
/* structure of an instrument io link */
struct instio {
char string[INSTIO_FLD_SZ]; /* the cat of location.
signal.parameter */
};
/* structure of a vxi link */
struct vxiio{
short flag; /* 0 = frame/slot, 1 = SA */
short frame;
short slot;
short la; /* logical address if flag =1 */
short signal;
char parm[VXI_PARAM_SZ];
};
/* union of possible address structures */
union value{
double value; /* constant */
struct pv_link pv_link; /* link to process variable*/
struct vmeio vmeio; /* vme io point */
struct camacio camacio; /* camac io point */
struct rfio rfio; /* CEBAF RF buffer interface */
struct abio abio; /* allen-bradley io point */
struct gpibio gpibio;
struct bitbusio bitbusio;
struct db_link db_link; /* Data base link */
void *ca_link; /* Channel Access link */
struct instio instio; /* instrument io link */
struct bbgpibio bbgpibio; /* bitbus to gpib io link */
struct vxiio vxiio; /* vxi io */
};
struct link{
long type;
long pad;
union value value;
};
typedef struct link DBLINK;
#endif

233
src/cvtDctsdr/recSup.h Normal file
View File

@@ -0,0 +1,233 @@
/* $Id$
* Record Support
* Author: Marty Kraimer
* 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:
* -----------------
* .01 11-11-91 jba Added include dbCommon.h,recGblSetSevr,recGblResetSevr
* .02 12-18-91 jba Changed caddr_t to void *
* .03 03-04-92 jba Added include for dbAccess.h
* .04 05-18-92 rcz removed extern
* .05 05-18-92 rcz Changed macro "GET_PRSET(" to "GET_PRSET(precSup,"
* .06 05-18-92 rcz New database access (removed extern)
* .07 07-16-92 jba Added macro recGblFwdLink
* .08 07-16-92 jba changed VALID_ALARM to INVALID_ALARM
* .09 08-10-92 jba added #defines for SIMM processing
* .10 08-11-92 jba added DB_INTEREST masks
* .11 08-13-92 jba added prototype for recGblGetAlarmDouble,
* .12 08-14-92 jba added prototypes recGblGetLinkValue,recGblPutLinkValue
* .13 09-15-92 jba added vxWorks ifdef
* .14 -7-27-93 mrk remove recGblResetSevr add recGblResetAlarms
* .15 03-18-94 mcn added fast link macros and prototypes
*/
#ifndef INCrecSuph
#define INCrecSuph 1
#ifdef vxWorks
#ifndef INCdbCommonh
#include <dbCommon.h>
#endif
#endif
/*
* One ABSOLUTELY must include dbAccess.h before the
* definitions in this file
*/
#ifndef INCdbAccessh
#include <dbAccess.h>
#endif
#ifndef INCalarmh
#include <alarm.h>
#endif
/*************************************************************************
* The following must match definitions in choiceGbl.ascii
*************************************************************************/
/* GBL_IVOA */
#define IVOA_CONTINUE 0
#define IVOA_NO_OUTPUT 1
#define IVOA_OUTPUT_IVOV 2
/*************************************************************************/
#define DB_INTEREST_SCAN 0x00000001
#define DB_INTEREST_CONTROL 0x00000002
#define DB_INTEREST_ALARMS 0x00000004
#define DB_INTEREST_DISPLAY 0x00000008
#define DB_INTEREST_IO 0x00000010
#define DB_INTEREST_CONVERT 0x00000020
#define DB_INTEREST_PRIVATE 0x00000040
#define recGblGetFastLink(PLNK,PREC,PVAL) \
\
((((PLNK)->type == CONSTANT) ||\
(! (((PLNK)->type == DB_LINK) || ((PLNK)->type == CA_LINK)) ))\
? 0\
: dbFastLinkGet((PLNK),(struct dbCommon *)(PREC),(PVAL)))
#define recGblPutFastLink(PLNK,PREC,PVAL) \
\
((((PLNK)->type == CONSTANT) ||\
(! (((PLNK)->type == DB_LINK) || ((PLNK)->type == CA_LINK)) ))\
? 0\
: dbFastLinkPut((PLNK),(struct dbCommon *)(PREC),(PVAL)))
#define recGblSetSevr(PREC,NSTA,NSEV) \
(\
((PREC)->nsev<(NSEV))\
? ((PREC)->nsta=(NSTA),(PREC)->nsev=(NSEV),TRUE)\
: FALSE\
)
typedef long (*RECSUPFUN) (); /* ptr to record support function*/
struct rset { /* record support entry table */
long number; /*number of support routines */
RECSUPFUN report; /*print report */
RECSUPFUN init; /*init support */
RECSUPFUN init_record; /*init record */
RECSUPFUN process; /*process record */
RECSUPFUN special; /*special processing */
RECSUPFUN get_value; /*get value field */
RECSUPFUN cvt_dbaddr; /*cvt dbAddr */
RECSUPFUN get_array_info;
RECSUPFUN put_array_info;
RECSUPFUN get_units;
RECSUPFUN get_precision;
RECSUPFUN get_enum_str; /*get string from enum item*/
RECSUPFUN get_enum_strs; /*get all enum strings */
RECSUPFUN put_enum_str; /*put string from enum item*/
RECSUPFUN get_graphic_double;
RECSUPFUN get_control_double;
RECSUPFUN get_alarm_double;
};
struct recSup {
long number; /*number of record types */
struct rset **papRset; /*ptr to arr of ptr to rset */
};
#define RSETNUMBER ( (sizeof(struct rset) - sizeof(long))/sizeof(RECSUPFUN) )
#define S_rec_noRSET (M_recSup| 1) /*Missing record support entry table*/
#define S_rec_outMem (M_recSup| 3) /*Out of Memory*/
/*************************************************************************
*
* The following is a valid reference
*
* precSup->papRset[1]->report(<args>)
*************************************************************************/
/* Definition os structure for routine get_value */
struct valueDes {
long field_type;
long no_elements;
void * pvalue;
};
/**************************************************************************
* The following macro returns either the addr of rset or NULL
* A typical usage is:
*
* struct rset *prset;
* if(!(prset=GET_PRSET(precSup,type))) {<null}
***********************************************************************/
#define GET_PRSET(PRECSUP,REC_TYPE)\
(\
(PRECSUP)\
?(\
(((REC_TYPE) < 1) || ((REC_TYPE) >= (PRECSUP)->number))\
? NULL\
: ((PRECSUP)->papRset[(REC_TYPE)])\
)\
: NULL\
)
/************************************************************************
* report(FILE fp,void *precord);
* init();
* init_record(precord,pass);
* process(void *precord);
* special(struct db_addr *paddr, after);
* get_value(precord,struct valueDes *p);
* cvt_dbaddr(struct db_addr *paddr);
* get_array_info(paddr,long *no_elements,long *offset);
* put_array_info(paddr,nNew);
* get_units(paddr,char units[8]);
* get_precision(struct db_addr *paddr,long *precision);
* get_enum_str(paddr,pbuffer);
* get_enum_strs(paddr,struct dbr_enumStrs *p);
* put_enum_str(paddr,pbuffer);
* get_graphic_double(paddr,struct dbr_grDouble *p);
* get_control_double(paddr,struct dbr_ctrlDouble *p);
* get_alarm_double(paddr,struct dbr_ctrlDouble *p);
***********************************************************************/
/* Global Record Support Routines*/
#ifdef __STDC__
void recGblDbaddrError(long status, struct dbAddr *paddr, char *pcaller_name);
void recGblRecordError(long status, void *precord, char *pcaller_name);
void recGblRecSupError(long status, struct dbAddr *paddr, char *pcaller_name, char *psupport_name);
void recGblGetGraphicDouble(struct dbAddr *paddr, struct dbr_grDouble *pgd);
void recGblGetControlDouble(struct dbAddr *paddr, struct dbr_ctrlDouble *pcd);
void recGblGetAlarmDouble(struct dbAddr *paddr, struct dbr_alDouble *pad);
void recGblGetPrec(struct dbAddr *paddr, long *pprecision);
long recGblGetLinkValue(struct link *plink,void *precord,
short dbrType,void *pdest,long *poptions,long *pnRequest);
long recGblPutLinkValue(struct link *plink,void *precord,
short dbrType,void *pdest,long *pnRequest);
unsigned short recGblResetAlarms(void *precord);
void recGblFwdLink(void *precord);
void recGblGetTimeStamp(void *precord);
long recGblInitFastInLink(struct link *plink, void *precord, short dbrType, char *fld_name);
long recGblInitFastOutLink(struct link *plink, void *precord, short dbrType, char *fld_name);
#else
void recGblDbaddrError();
void recGblRecordError();
void recGblRecSupError();
void recGblGetGraphicDouble();
void recGblGetControlDouble();
void recGblGetAlarmDouble();
void recGblGetPrec();
long recGblGetLinkValue();
long recGblPutLinkValue();
unsigned short recGblResetAlarms();
long recGblInitFastInLink();
long recGblInitFastOutLink();
#endif /*__STDC__*/
#endif /*INCrecSuph*/

123
src/cvtDctsdr/sdr2device.c Normal file
View File

@@ -0,0 +1,123 @@
/*sdr2device.c*/
/* Convert device support to new ascii formats*/
/*
*
* Author: Marty Kraimer
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 05-10-95 mrk Original Version
*/
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <time.h>
#include <errMdef.h>
#include <dbDefs.h>
#include <dbStaticLib.h>
#include <devSup.h>
DBBASE *pdbbase;
#define NUM_LINK_TYPES 16
static char *plink_type_name[NUM_LINK_TYPES] = {
"CONSTANT",
"PV_LINK",
"VME_IO",
"CAMAC_IO",
"AB_IO",
"GPIB_IO",
"BITBUS_IO",
0,0,0,
"DB_LINK",
"CA_LINK",
"INST_IO",
"BBGPIB_IO",
"RF_IO",
"VXI_IO"
};
static char *defdctsdr = "default.dctsdr";
int main(int argc,char **argv)
{
FILE *fp;
long status;
char *sdr_filename;
char filename[40];
char *pfilename = filename;
struct recType *precType;
struct devChoiceRec *pdevChoiceRec;
struct devChoiceSet *pdevChoiceSet;
struct devChoice *pdevChoice;
struct recDevSup *precDevSup;
struct devSup *pdevSup;
int i,j;
if(argc==2) {
sdr_filename = argv[1];
} else {
sdr_filename = defdctsdr;
}
fp = fopen(sdr_filename,"r");
if(!fp) {
printf("Error opening file %s\n",sdr_filename);
exit(-1);
}
pdbbase=dbAllocBase();
status=dbRead(pdbbase,fp);
if(status) {
errMessage(status,"dbRead");
exit(-1);
}
fclose(fp);
strcpy(pfilename,"device.ascii");
fp = fopen(pfilename,"w");
if(!fp) {
printf("Error opening file %s\n",pfilename);
exit(-1);
}
precType = pdbbase->precType;
precDevSup = pdbbase->precDevSup;
pdevChoiceRec = pdbbase->pchoiceDev;
for(i=0; i<precType->number; i++) {
pdevSup = precDevSup->papDevSup[i];
if(!pdevSup) continue;
pdevChoiceSet = pdevChoiceRec->papDevChoiceSet[i];
if(!pdevChoiceSet) continue;
for(j=0; j<pdevSup->number; j++) {
if(!pdevSup->papDsetName[j]) continue;
pdevChoice = pdevChoiceSet->papDevChoice[j];
if(!pdevChoice) continue;
fprintf(fp,"device(%s,%s,%s,\"%s\")\n",
precType->papName[i],
plink_type_name[pdevChoice->link_type],
pdevSup->papDsetName[j],
pdevChoice->pchoice);
}
}
fclose(fp);
return(0);
}

View File

@@ -1,5 +1,5 @@
/*atodb.c*/
/* share/src/db @(#)atdb.c 1.7 2/25/94 */
/*sdr2driver.c*/
/* Convert driver support to new ascii formats*/
/*
*
* Author: Marty Kraimer
@@ -27,7 +27,7 @@
*
* Modification Log:
* -----------------
* .01 07-13-93 mrk Original version
* .01 05-10-95 mrk Original Version
*/
#include <stdlib.h>
@@ -37,57 +37,48 @@
#include <errMdef.h>
#include <dbDefs.h>
#include <dbStaticLib.h>
#include <drvSup.h>
DBBASE *pdbbase;
DBENTRY *pdbentry;
#ifdef __STDC__
main(int argc,char **argv)
#else
main(argc,argv)
int argc;
char **argv;
#endif /*__STDC__*/
{
FILE *fpdctsdr;
FILE *fp;
long status;
char *ptime;
time_t timeofday;
char *rectype;
if(argc!=3) {
printf("Usage: atdb default.dctsdr file.database < file.rpt\n");
exit(-1);
static char *defdctsdr = "default.dctsdr";
int main(int argc,char **argv)
{
FILE *fp;
long status;
char *sdr_filename;
char filename[40];
char *pfilename = filename;
struct drvSup *pdrvSup;
int i,j;
if(argc==2) {
sdr_filename = argv[1];
} else {
sdr_filename = defdctsdr;
}
fpdctsdr = fopen(argv[1],"r");
if(!fpdctsdr) {
errMessage(0,"Error opening input file");
exit(-1);
}
if(fopen(argv[2],"r")) {
errMessage(-1,"Output File already exists");
fp = fopen(sdr_filename,"r");
if(!fp) {
printf("Error opening file %s\n",sdr_filename);
exit(-1);
}
pdbbase=dbAllocBase();
pdbentry=dbAllocEntry(pdbbase);
status=dbRead(pdbbase,fpdctsdr);
status=dbRead(pdbbase,fp);
if(status) {
errMessage(status,"dbRead");
exit(-1);
}
yyreset();
yyparse();
fp=fopen(argv[2],"w");
if(fp==NULL) {
errMessage(0,"Error opening output file");
exit(-1);
}
status = dbWrite(pdbbase,fpdctsdr,fp);
if(status) errMessage(status,"dbWrite");
fclose(fpdctsdr);
fclose(fp);
dbFreeEntry(pdbentry);
dbFreeBase(pdbbase);
strcpy(pfilename,"driver.ascii");
fp = fopen(pfilename,"w");
if(!fp) {
printf("Error opening file %s\n",pfilename);
exit(-1);
}
pdrvSup = pdbbase->pdrvSup;
for(i=0; i<pdrvSup->number; i++) {
fprintf(fp,"driver(%s)\n",pdrvSup->papDrvName[i]);
}
fclose(fp);
return(0);
}

115
src/cvtDctsdr/sdr2gblmenu.c Normal file
View File

@@ -0,0 +1,115 @@
/*sdr2gblmenu.c*/
/* Convert global menus from old .dctsdr file to new ascii formats */
/*
*
* Author: Marty Kraimer
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 05-10-95 mrk Original Version
*/
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <time.h>
#include <errMdef.h>
#include <dbDefs.h>
#include <dbStaticLib.h>
DBBASE *pdbbase;
#define NUM_GBL_MENUS 11
static char *aiMenuName[NUM_GBL_MENUS] = {
"menuYesNo",
"menuScan",
"menuAlarmSevr",
"menuAlarmStat",
"menuArrType",
"menuOmsl",
"menuLinr",
"menuFtype",
"menuCompress",
"menuPriority",
"menuIvoa"
};
static char *defdctsdr = "default.dctsdr";
int main(int argc,char **argv)
{
FILE *fp;
long status;
char *sdr_filename;
char filename[40];
char *pfilename = filename;
char choice_name[50];
char temp_str[50];
char *ptemp;
struct choiceSet *pchoiceSet;
int i,j;
if(argc==2) {
sdr_filename = argv[1];
} else {
sdr_filename = defdctsdr;
}
fp = fopen(sdr_filename,"r");
if(!fp) {
printf("Error opening file %s\n",sdr_filename);
exit(-1);
}
pdbbase=dbAllocBase();
status=dbRead(pdbbase,fp);
if(status) {
errMessage(status,"dbRead");
exit(-1);
}
fclose(fp);
for(i=0; i<NUM_GBL_MENUS; i++) {
strcpy(pfilename,aiMenuName[i]);
strcat(pfilename,".ascii");
fp = fopen(pfilename,"w");
if(!fp) {
printf("Error opening file %s\n",pfilename);
exit(-1);
}
pchoiceSet = pdbbase->pchoiceGbl->papChoiceSet[i];
fprintf(fp,"menu(%s) {\n",aiMenuName[i]);
for(j=0; j<pchoiceSet->number; j++) {
strcpy(temp_str,pchoiceSet->papChoice[j]);
ptemp = temp_str;
while(*ptemp) {
if(!isalnum(*ptemp)) *ptemp = '_';
ptemp++;
}
sprintf(choice_name,"%s%s",aiMenuName[i],temp_str);
fprintf(fp,"\tchoice(%s,\"%s\")\n",
choice_name,pchoiceSet->papChoice[j]);
}
fprintf(fp,"}\n");
fclose(fp);
}
return(0);
}

View File

@@ -0,0 +1,439 @@
/*sdr2recordtype.c*/
/* Convert recordtype and record menus from .dctsdr file to new ascii formats */
/* sdr2recordtype <recordtype> <recordtype.h> <file.dctsdr>
/*
*
* Author: Marty Kraimer
*
* Experimental Physics and Industrial Control System (EPICS)
*
* Copyright 1991, the Regents of the University of California,
* and the University of Chicago Board of Governors.
*
* This software was produced under U.S. Government contracts:
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
* and (W-31-109-ENG-38) at Argonne National Laboratory.
*
* Initial development by:
* The Controls and Automation Group (AT-8)
* Ground Test Accelerator
* Accelerator Technology Division
* Los Alamos National Laboratory
*
* Co-developed with
* The Controls and Computing Group
* Accelerator Systems Division
* Advanced Photon Source
* Argonne National Laboratory
*
* Modification Log:
* -----------------
* .01 05-15-95 mrk Original Version
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <time.h>
#include <errMdef.h>
#include <dbDefs.h>
#include <special.h>
#include <dbStaticLib.h>
DBBASE *pdbbase;
static char *defdctsdr = "default.dctsdr";
static char *ptypename[DBF_NTYPES] = {
"DBF_STRING",
"DBF_CHAR",
"DBF_UCHAR",
"DBF_SHORT",
"DBF_USHORT",
"DBF_LONG",
"DBF_ULONG",
"DBF_FLOAT",
"DBF_DOUBLE",
"DBF_ENUM",
"DBF_MENU",
"DBF_MENU",
"DBF_MENU",
"DBF_DEVICE",
"DBF_INLINK",
"DBF_OUTLINK",
"DBF_FWDLINK",
"DBF_NOACCESS"
};
static char *pguigroup[] = {
"",
"GUI_COMMON",
"GUI_ALARMS",
"GUI_BITS1",
"GUI_BITS2",
"GUI_CALC",
"GUI_CLOCK",
"GUI_COMPRESS",
"GUI_CONVERT",
"GUI_DISPLAY",
"GUI_HIST",
"GUI_INPUTS",
"GUI_LINKS",
"GUI_MBB",
"GUI_MOTOR",
"GUI_OUTPUT",
"GUI_PID",
"GUI_PULSE",
"GUI_SELECT",
"GUI_SEQ1",
"GUI_SEQ2",
"GUI_SEQ3",
"GUI_SUB",
"GUI_TIMER",
"GUI_WAVE",
"GUI_SCAN"
};
static char *pgblMenuNames[11] = {
"menuYesNo",
"menuScan",
"menuAlarmSevr",
"menuAlarmStat",
"menuArrType",
"menuOmsl",
"menuLinr",
"menuFtype",
"menuCompress",
"menuPriority",
"menuIvoa"
};
int main(int argc,char **argv)
{
FILE *fp,*fpInclude;
long status;
char *sdrFilename;
char *recordtypeName;
char *recordtypeInclude;
char filename[40];
char *pfilename = filename;
struct recType *precType;
struct recDes *precDes;
struct choiceRec *pchoiceRec;
struct arrChoiceSet *parrChoiceSet;
struct choiceSet *pchoiceSet;
struct recTypDes *precTypDes;
struct fldDes *pfldDes;
char menuname[50];
char *pmenuname = menuname;
char choiceName[50];
char tempStr[50];
char *ptemp;
int indRectype;
int i,j;
int indFldDes;
char includeLine[80];
DBENTRY dbentry;
DBENTRY *pdbentry=&dbentry;
char valuestring[80];
char *pstr;
char **paprecChoiceNames;
int makeCommon=FALSE;
if(argc<3 || argc>4) {
fprintf(stderr,"usage: sdr2recordtype <recordtype> <recordtype.h> [<file.dctsdr>]");
exit(-1);
}
recordtypeName = argv[1];
if(strcmp(recordtypeName,"dbCommon")==0) makeCommon=TRUE;
recordtypeInclude = argv[2];
if(argc==4) {
sdrFilename = argv[3];
} else {
sdrFilename = defdctsdr;
}
fpInclude = fopen(recordtypeInclude,"r");
if(!fpInclude) {
fprintf(stderr,"Error opening file %s\n",recordtypeInclude);
exit(-1);
}
/*skip all lines up to beginning of structure*/
while(TRUE) {
pstr = fgets(includeLine,80,fpInclude);
if(!pstr) {
fprintf(stderr,"Does not appear to be include file%s\n",
recordtypeInclude);
exit(-1);
}
if(strstr(includeLine,"struct ")) break;
}
fp = fopen(sdrFilename,"r");
if(!fp) {
fprintf(stderr,"Error opening file %s\n",sdrFilename);
exit(-1);
}
pdbbase=dbAllocBase();
status=dbRead(pdbbase,fp);
if(status) {
errMessage(status,"dbRead");
exit(-1);
}
fclose(fp);
precType = pdbbase->precType;
for(indRectype=0; indRectype< precType->number; indRectype++) {
if(!precType->papName[indRectype]) continue;
if(makeCommon) break;
if(strcmp(recordtypeName,precType->papName[indRectype]) == 0) break;
}
if(indRectype>=precType->number) {
fprintf(stderr,"%s not found\n",recordtypeName);
exit(-1);
}
if(makeCommon) {
strcpy(pfilename,"dbCommon");
} else {
strcpy(pfilename,recordtypeName);
strcat(pfilename,"Record");
}
strcat(pfilename,".ascii");
fp = fopen(pfilename,"w");
if(!fp) {
fprintf(stderr,"Error opening file %s\n",pfilename);
exit(-1);
}
/*Create record instance with initial values*/
dbInitEntry(pdbbase,pdbentry);
status = dbFindRecdes(pdbentry,precType->papName[indRectype]);
if(status) {printf("No record description\n"); exit(-1);}
status = dbCreateRecord(pdbentry,"temp");
if(status) {printf("dbCreateRecord failed\n"); exit(-1);}
/*For menus let name be <recordtype><fieldname> */
precTypDes = pdbbase->precDes->papRecTypDes[indRectype];
parrChoiceSet = pdbbase->pchoiceRec->papArrChoiceSet[indRectype];
if(!parrChoiceSet) goto gen_rectype;
if(makeCommon) goto gen_rectype;
paprecChoiceNames = (char **)calloc(parrChoiceSet->number,sizeof(char *));
for(i=0; i< parrChoiceSet->number; i++) {
/*Find first field that uses this choice set */
for(j=0; j< precTypDes->no_fields; j++) {
pfldDes = precTypDes->papFldDes[j];
if(pfldDes->field_type==DBF_RECCHOICE
&& pfldDes->choice_set==i) break;
}
if(j>=precTypDes->no_fields) continue;
strcpy(pmenuname,recordtypeName);
strcat(pmenuname,pfldDes->fldname);
for(j=strlen(pmenuname)-1; j>0; j--) {
if(pmenuname[j] == ' ') pmenuname[j] = 0;
}
paprecChoiceNames[i] = calloc(1,strlen(pmenuname) + 1);
strcpy(paprecChoiceNames[i],pmenuname);
fprintf(fp,"menu(%s) {\n",pmenuname);
pchoiceSet = parrChoiceSet->papChoiceSet[i];
for(j=0; j<pchoiceSet->number; j++) {
strcpy(tempStr,pchoiceSet->papChoice[j]);
ptemp = tempStr;
while(*ptemp) {
if(!isalnum(*ptemp)) *ptemp = '_';
ptemp++;
}
sprintf(choiceName,"%s_%s",pmenuname,tempStr);
fprintf(fp,"\tchoice(%s,\"%s\")\n",
choiceName,pchoiceSet->papChoice[j]);
}
fprintf(fp,"}\n");
}
gen_rectype:
if(makeCommon) {
indFldDes=-1;
} else {
fprintf(fp,"recordtype(%s) {\n",recordtypeName);
fprintf(fp,"\tinclude \"dbCommon.ascii\" \n");
/*Skip fields in dbCommon*/
for(indFldDes=0; indFldDes< precTypDes->no_fields; indFldDes++) {
if(strcmp(precTypDes->papFldDes[indFldDes]->fldname,"FLNK")==0) break;
}
}
while(++indFldDes < precTypDes->no_fields) {
pfldDes = precTypDes->papFldDes[indFldDes];
if(pfldDes->field_type==DBF_NOACCESS) {
char *prtn;
char fldname[5];
strcpy(fldname,pfldDes->fldname);
pstr = fldname;
while(*pstr) {
if(*pstr == ' ') {
*pstr = 0;
break;
}
*pstr = tolower(*pstr);
pstr++;
}
while(TRUE) {
prtn = fgets(includeLine,80,fpInclude);
if(!prtn) {
fprintf(stderr, "field %s not found in %s\n",
pfldDes->fldname,recordtypeInclude);
break;
}
if(!(pstr = strstr(includeLine,fldname))) continue;
if(isalnum(*(pstr + strlen(fldname)))) continue;
break;
}
if(!prtn) continue;
if(strstr(pstr,"Created Pad")) continue;
}
strcpy(tempStr,pfldDes->fldname);
for(j=strlen(tempStr)-1; j>0; j--) {
if(tempStr[j] == ' ') tempStr[j] = 0;
}
fprintf(fp,"\tfield(%s,%s) {\n",
tempStr,ptypename[pfldDes->field_type]);
if(pfldDes->prompt[0]!=0) {
fprintf(fp,"\t\tprompt(\"%s\")\n",pfldDes->prompt);
}
if(pfldDes->promptflag) {
fprintf(fp,"\t\tpromptgroup(%s)\n",pguigroup[pfldDes->promptflag]);
}
if(pfldDes->as_level == 0) fprintf(fp,"\t\tasl(ASL0)\n");
if(pfldDes->special) {
fprintf(fp,"\t\tspecial(");
switch(pfldDes->special) {
case SPC_NOMOD: fprintf(fp,"SPC_NOMOD)\n"); break;
case SPC_DBADDR: fprintf(fp,"SPC_DBADDR)\n"); break;
case SPC_SCAN: fprintf(fp,"SPC_SCAN)\n"); break;
case SPC_HDWLINK: fprintf(fp,"SPC_HDWLINK)\n"); break;
case SPC_ALARMACK: fprintf(fp,"SPC_ALARMACK)\n"); break;
case SPC_AS: fprintf(fp,"SPC_AS)\n"); break;
case SPC_MOD: fprintf(fp,"SPC_MOD)\n"); break;
case SPC_RESET: fprintf(fp,"SPC_RESET)\n"); break;
case SPC_LINCONV: fprintf(fp,"SPC_LINCONV)\n"); break;
case SPC_CALC: fprintf(fp,"SPC_CALC)\n"); break;
default : fprintf(fp,"%d)\n",pfldDes->special);
}
}
if(pfldDes->process_passive) fprintf(fp,"\t\tpp(TRUE)\n");
if(pfldDes->cvt_type) fprintf(fp,"\t\tbase(HEX)\n");
if(pfldDes->interest)
fprintf(fp,"\t\tinterest(%d)\n",pfldDes->interest);
switch(pfldDes->field_type) {
case DBF_STRING: {
fprintf(fp,"\t\tsize(%d)\n",pfldDes->size);
}
break;
case DBF_CHAR: {
status = dbFindField(pdbentry,pfldDes->fldname);
if(status) {printf("dbFindField failed\n"); exit(-1);}
pstr = dbGetString(pdbentry);
if(pfldDes->initial.char_value)
fprintf(fp,"\t\tinitial(\"%d\")\n",
pfldDes->initial.char_value);
}
break;
case DBF_UCHAR: {
if(pfldDes->initial.uchar_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.uchar_value);
}
break;
case DBF_SHORT: {
if(pfldDes->initial.short_value)
fprintf(fp,"\t\tinitial(\"%d\")\n",
pfldDes->initial.short_value);
}
break;
case DBF_USHORT: {
if(pfldDes->initial.ushort_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ushort_value);
}
break;
case DBF_LONG: {
if(pfldDes->initial.long_value)
fprintf(fp,"\t\tinitial(\"%d\")\n",
pfldDes->initial.long_value);
}
break;
case DBF_ULONG: {
if(pfldDes->initial.ulong_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ulong_value);
}
break;
case DBF_FLOAT: {
if(pfldDes->initial.float_value)
fprintf(fp,"\t\tinitial(\"%g\")\n",
pfldDes->initial.float_value);
}
break;
case DBF_DOUBLE: {
if(pfldDes->initial.double_value)
fprintf(fp,"\t\tinitial(\"%g\")\n",
pfldDes->initial.double_value);
}
break;
case DBF_ENUM: {
if(pfldDes->initial.enum_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.enum_value);
}
break;
case DBF_GBLCHOICE: {
fprintf(fp,"\t\tmenu(%s)\n",pgblMenuNames[pfldDes->choice_set]);
if(pfldDes->initial.ushort_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ushort_value);
}
break;
case DBF_CVTCHOICE: {
fprintf(fp,"\t\tmenu(menuConvert)\n");
if(pfldDes->initial.ushort_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ushort_value);
}
break;
case DBF_RECCHOICE: {
fprintf(fp,"\t\tmenu(%s)\n",paprecChoiceNames[pfldDes->choice_set]);
if(pfldDes->initial.ushort_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ushort_value);
}
break;
case DBF_DEVCHOICE: {
if(pfldDes->initial.ushort_value)
fprintf(fp,"\t\tinitial(\"%u\")\n",
pfldDes->initial.ushort_value);
}
break;
case DBF_INLINK: {
}
break;
case DBF_OUTLINK: {
}
break;
case DBF_FWDLINK: {
}
break;
case DBF_NOACCESS: { /*includeLine holds definition*/
char *ptempStr = tempStr;
fprintf(fp,"\t\tsize(%d)\n",pfldDes->size);
ptemp = includeLine;
while(*ptemp==' ' || *ptemp=='\t') ptemp++;
while(*ptemp!=';') *ptempStr++ = *ptemp++;
*ptempStr = 0;
fprintf(fp,"\t\textra(\"%s\")\n",tempStr);
}
break;
}
fprintf(fp,"\t}\n");
if(makeCommon
&& (strcmp(precTypDes->papFldDes[indFldDes]->fldname,"FLNK")==0))
break;
}
if(!makeCommon)fprintf(fp,"}\n");
fclose(fpInclude);
fclose(fp);
return(0);
}

80
src/cvtDctsdr/sdrHeader.h Normal file
View File

@@ -0,0 +1,80 @@
/* sdrHeader.h - header for self defining record */
/* share/epicsH $Id$ */
/*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 mm-dd-yy iii Comment
* .02 05-03-92 rcz New database access (removed extern)
*/
#ifndef INCsdrHeader
#define INCsdrHeader 1
struct sdrHeader {
long magic; /* magic number */
long nbytes; /* number of bytes of data*/
short type; /* sdr record type */
short pad; /* padding */
long create_date; /* creation date */
};
#define DBMAGIC 0x494f4300 /* In ascii this is IOC */
/*The following types are defined*/
#define SDR_DB_RECTYPE 0 /*Record types */
#define SDR_DB_RECORDS 1 /*database records. index is type */
#define SDR_DB_RECDES 2 /*Database Run Time Record Description */
#define SDR_DB_PVD 3 /*Process Variable Directory */
#define SDR_CHOICEGBL 4 /*Choice table. Global */
#define SDR_CHOICECVT 5 /*Choice table. Convert */
#define SDR_CHOICEREC 6 /*Choice table. Record Specific */
#define SDR_CHOICEDEV 7 /*Choice table. Device Specific */
#define SDR_DEVSUP 8 /*device support tables */
#define SDR_CVTTABLE 9 /*breakpoint tables */
#define SDR_DRVSUP 10 /*driver support tables */
#define SDR_RECSUP 11 /*record support tables */
#define SDR_ALLSUMS 12 /*special sum structure*/
#define SDR_NTYPES SDR_ALLSUMS+1
/************************************************************************/
#define S_sdr_notLoaded (M_sdr| 1) /*dbRecType.sdr not loaded*/
#define S_sdr_noOpen (M_sdr| 3) /*Can't open file*/
#define S_sdr_noRead (M_sdr| 5) /*read failure*/
#define S_sdr_noMagic (M_sdr| 7) /*wrong magic number*/
#define S_sdr_noRecDef (M_sdr| 9) /*undefined record type*/
#define S_sdr_noAlloc (M_sdr|11) /*malloc error*/
#define S_sdr_noReplace (M_sdr|13) /*Can't replace loaded SDR file*/
#define S_sdr_seqLoad (M_sdr|15) /*dbRecType.sdr not first*/
#define S_sdr_noSdrType (M_sdr|17) /*undefined sdr type*/
#define S_sdr_sumError (M_sdr|19) /*sdrSum Error*/
#define SUM_LEN 50
struct sdrSum {
char allSdrSums[SUM_LEN];
};
#endif /*INCsdrHeader*/

36
src/cvtDctsdr/sf2db.1 Normal file
View File

@@ -0,0 +1,36 @@
.\" @(#)
.TH SF2DB 1 "04 Nov 1993"
.SH NAME
sf2db \- make a new ascii database ".db" file from an old dct short form report
.SH SYNOPSIS
.B sf2db
.B name
<
.B short_form_rpt
>
.B db_file
.SH AVAILABILITY
The tool in available under Unix from the EPICS add_on directory.
.SH DESCRIPTION
.LP
This tool reads a dct short form report file from standard in and
writes a ".db" (new ascii database format) file to standard out. A
.B name
must be given for the database. The name specified is used to name
the ".database" file when the ".db" file is converted to a binary ".database".
.sp
The output of this tool can be imported to gdct(1) for editting.
.SH "EXAMPLE USAGE"
.LP
sf2db test < old.short.form > new.db
.sp
This command will read old.short.form and produce the file new.db. When
new.db is fed into db2database(1), a binary database file will be created
named test.database.
.SH "SEE ALSO"
.BR gdct(1),
.BR db2database(1),
.BR dbLoadRecords(3),
.BR dbfile(5),
.sp
.B "GDCT User's Manual"

26
src/cvtDctsdr/sf2dbLex.l Executable file
View File

@@ -0,0 +1,26 @@
b [a-zA-Z0-9_]
a [ \t]
d [a-zA-Z0-9_\,\./\*#\{\}\[\]%:;!|\'\-&\(\)@\?\+<>=$\^\~]
%{
%}
%%
^[A-Z0-9_]+ { yylval.Str=(char *)malloc(strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(FIELD); }
^"PV:" { return(PV); }
"Type:" { return(TYPE); }
" " { return(CLOSE); }
"$$end" { return(CLOSE); }
{d}+ { yylval.Str=(char *)malloc(strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(WORD); }
. ;
\n { line_num++; }
%%

151
src/cvtDctsdr/sf2dbYacc.y Executable file
View File

@@ -0,0 +1,151 @@
%{
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <epicsVersion.h>
#undef PUKE_FACE
#if EPICS_VERSION<4
#if EPICS_REVISION<13
#if EPICS_MODIFICATION<1 && EPICS_UPDATE_LEVEL<12
#define PUKE_FACE
#endif
#endif
#endif
/* kludge for buggy sun lex/yacc. exploits the fact that we know the union */
/* below will be given the name YYSTYPE. done so that ifndef YYSTYPE */
/* (as it appears in pdb.c) fails */
/* #define YYSTYPE OUR_YYSTYPE */
int line_num;
char Field_val[1000];
%}
%start sf2db
%token <Str> WORD
%token <Str> FIELD
%token <Str> TYPE
%token <Str> PV CLOSE
%union
{
int Int;
char Char;
char *Str;
double Real;
}
%%
sf2db: crap_head records closer
{ printf("\n"); }
;
closer:
| CLOSE
;
crap_head:
| crap_header CLOSE
| CLOSE
| crap_header
;
crap_header: crap_header WORD
| WORD
;
records: records record
| record
;
record: header fields CLOSE
{ printf("\t}\n"); }
;
header: PV WORD TYPE WORD WORD
{ printf("\trecord(%s,\"%s\") {\n",$4,$2); }
| PV WORD TYPE WORD
{ printf("\trecord(%s,\"%s\") {\n",$4,$2); }
fields: field
| fields field
;
field: a_field words
{
printf("\t\tfield(%s,\"%s\")\n",$<Str>1,Field_val);
}
;
a_field: FIELD
{
Field_val[0]='\0';
$<Str>$ = $1;
}
;
words:
| words a_word
;
a_word: WORD
{
char *p;
if((p=strstr($1,".PP.MS"))) {p[0]=' ';p[3]=' '; }
else if((p=strstr($1,".PP.NMS"))) {p[0]=' ';p[3]=' ';}
else if((p=strstr($1,".NPP.MS"))) {p[0]=' ';p[4]=' ';}
else if((p=strstr($1,".NPP.NMS"))) {p[0]=' ';p[4]=' ';}
else { if(strlen(Field_val)>0) strcat(Field_val," "); }
strcat(Field_val,$1);
}
;
%%
#include "sf2dbLex.c"
yyerror(str)
char *str;
{ fprintf(stderr,"Error line %d : %s\n",line_num, yytext); }
/*-----------------------main routine-----------------------*/
main(argc, argv)
int argc;
char **argv;
{
FILE *fdin;
/* remember that the database name is not retrieved from the .report
file, it is specified as a command line argument */
if( argc < 2 )
{
printf("Usage: %s database_name < dct_report_file > new_gdct_db_file.db\n",
argv[0]);
printf("\n\twhere\n\tdatabase_name: the name you wish to give the .database file\n");
printf("\tdct_report_file: the old dct short form report file\n");
printf("\tnew_gdct_db_file.db: the new gdct db file name, this file is used as \n\t\tinput to the gdct.\n");
exit(0);
}
#ifdef PUKE_HEAD
printf("database(x) { nowhere() {\n");
#endif
/* yyreset(); */
yyparse();
#ifdef PUKE_HEAD
printf("}}\n");
#endif
/* fdin = freopen("tester.report", "r+", stdin);
yyreset();
yyparse(); */
}

54
src/cvtDctsdr/special.h Normal file
View File

@@ -0,0 +1,54 @@
/* special.h */
/* share/epicsH $Id$ */
/*
* Author: Marty Kraimer
* 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:
* -----------------
* .01 06-07-91 mrk Cleaned up
* .02 03-04-92 jba Added special Hardware Link
* .03 07-27-93 mrk Added SPC_ALARMACK
* .04 02-09-94 mrk Added SPC_AS
*/
#ifndef INCspecialh
#define INCspecialh 1
/* types 1-99 are global. Record specific must start with 100 */
#define SPC_NOMOD 1 /*Field must not be modified */
#define SPC_DBADDR 2 /*db_name_to_addr must call cvt_dbaddr */
#define SPC_SCAN 3 /*A scan related field is being changed */
#define SPC_HDWLINK 4 /*Special Hardware Link */
#define SPC_ALARMACK 5 /*Special Alarm Acknowledgement*/
#define SPC_AS 6 /* Access Security*/
/* useful when record support must be notified of a field changing value*/
#define SPC_MOD 100
/* used by all records that support a reset field */
#define SPC_RESET 101 /*The res field is being modified*/
/* Specific to conversion (Currently only ai */
#define SPC_LINCONV 102 /*A linear conversion field is being changed*/
/* Specific to calculation records */
#define SPC_CALC 103 /*The CALC field is being changed*/
#endif

View File

@@ -1,45 +0,0 @@
EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_LDLIBS = -lDb -lCom -lm
USR_LDFLAGS = -L.
LEX = $(ELEX)
YACC = $(EYACC)
YACCOPT = -l
LEXOPT = -L
DEPLIBS_BASE = $(EPICS_BASE_LIB)
DEPLIBS = ./libDb.a\
$(DEPLIBS_BASE)/libCom.a
# $(DEPLIBS_BASE)/libDb.a
SRCS.c = \
../dbStaticLib.c \
atdb_yacc.c \
../dbta.c \
../dbl.c \
../dbls.c
LIBOBJS = dbStaticLib.o
LIBNAME = libDb.a
PROD = atdb dbl dbls dbta
include $(EPICS)/config/RULES.Unix
atdb: atdb_yacc.o $(DEPLIBS)
$(LINK.c) -o $@ atdb_yacc.o $(LDLIBS)
# Extra rule since atdb_lex.c is included in atdb_yacc.c
# In my opinion, these objects should really be built
# independently.
atdb_yacc.o: atdb_lex.c ../atdb.c
clean::
@$(RM) atdb_lex.c atdb_yacc.c

View File

@@ -2,27 +2,78 @@ EPICS = ../../../..
include Target.include
include $(EPICS)/config/CONFIG_BASE
USR_CFLAGS = -ansi
VX_WARN_YES = -Wall -pedantic
MENUS += menuAlarmSevr.h
MENUS += menuAlarmStat.h
MENUS += menuArrType.h
MENUS += menuCompress.h
MENUS += menuFtype.h
MENUS += menuIvoa.h
MENUS += menuLinr.h
MENUS += menuOmsl.h
MENUS += menuPriority.h
MENUS += menuScan.h
MENUS += menuYesNo.h
RECTYPES += dbCommon.h
ASCII = dbCommonRecord.ascii menuGlobal.ascii all.ascii
SRCS.c = \
../dbAccess.c ../dbBkpt.c ../dbFastLinkConv.c ../dbLink.c \
../dbNotify.c ../dbStaticLib.c ../iocInit.c ../drvTS.c ../dbScan.c \
../dbEvent.c ../dbTest.c ../dbls.c ../db_access.c \
../db_test.c ../recGbl.c ../callback.c ../taskwd.c \
../dbCaLink.c ../dbCaDblink.c ../devLib.c ../initHooks.c
../dbAccess.c\
../dbBkpt.c\
../dbConvert.c\
../dbFastLinkConv.c\
../dbNotify.c\
../iocInit.c\
../drvTS.c\
../dbScan.c \
../dbEvent.c\
../dbTest.c\
../db_access.c \
../db_test.c\
../recGbl.c\
../callback.c\
../taskwd.c \
../dbCaLink.c\
../dbCaDblink.c\
../devLib.c\
../initHooks.c
OBJSdbLib = \
dbAccess.o dbBkpt.o dbFastLinkConv.o dbLink.o dbNotify.o \
dbStaticLib.o iocInit.o drvTS.o dbScan.o dbEvent.o dbTest.o dbls.o \
db_access.o db_test.o recGbl.o callback.o taskwd.o dbCaLink.o \
dbCaDblink.o devLib.o
LIBOBJS = \
dbAccess.o\
dbBkpt.o\
dbConvert.o\
dbFastLinkConv.o\
dbNotify.o \
iocInit.o\
drvTS.o\
dbScan.o\
dbEvent.o\
dbTest.o\
db_access.o\
db_test.o\
recGbl.o\
callback.o\
taskwd.o\
dbCaLink.o \
dbCaDblink.o\
devLib.o
PROD = initHooks.o
PROD = initHooks.o dbLib
LIBNAME = dbLib
include $(EPICS)/config/RULES.Vx
dbLib: $(OBJSdbLib)
dbCommon.h: ../dbCommonRecord.ascii dbCommon.ascii
$(RM) $@
$(LINK.c) $@ $(OBJSdbLib) $(LDLIBS)
$(EPICS_BASE)/bin/$(HOST_ARCH)/dbAsciiToRecordtypeH $<
dbCommon.ascii: ../dbCommon.ascii
@test -f $@ || ln -s $< $@
clean::
@$(RM) dbCommon.ascii rec base

234
src/db/all.ascii Normal file
View File

@@ -0,0 +1,234 @@
path "./base/rec"
include "menuGlobal.ascii"
include "menuConvert.ascii"
include "aiRecord.ascii"
#include "aaiRecord.ascii"
include "aoRecord.ascii"
#include "aaoRecord.ascii"
include "biRecord.ascii"
include "boRecord.ascii"
include "calcRecord.ascii"
include "compressRecord.ascii"
include "dfanoutRecord.ascii"
include "egRecord.ascii"
include "egeventRecord.ascii"
include "erRecord.ascii"
include "ereventRecord.ascii"
include "eventRecord.ascii"
include "fanoutRecord.ascii"
include "histogramRecord.ascii"
include "longinRecord.ascii"
include "longoutRecord.ascii"
include "mbbiRecord.ascii"
include "mbbiDirectRecord.ascii"
include "mbboRecord.ascii"
include "mbboDirectRecord.ascii"
include "permissiveRecord.ascii"
include "pidRecord.ascii"
include "pulseCounterRecord.ascii"
include "pulseDelayRecord.ascii"
include "pulseTrainRecord.ascii"
include "scanRecord.ascii"
include "selRecord.ascii"
include "seqRecord.ascii"
include "stateRecord.ascii"
include "steppermotorRecord.ascii"
include "stringinRecord.ascii"
include "stringoutRecord.ascii"
include "subRecord.ascii"
#include "gsubRecord.ascii"
#include "palRecord.ascii"
include "subArrayRecord.ascii"
include "timerRecord.ascii"
include "waitRecord.ascii"
include "waveformRecord.ascii"
device(ai,CONSTANT,devAiSoft,"Soft Channel")
device(ai,CONSTANT,devAiSoftRaw,"Raw Soft Channel")
device(ai,VME_IO,devAiXy566Se,"XYCOM-566 SE Scanned")
device(ai,VME_IO,devAiXy566Di,"XYCOM-566 Dif Scanned")
device(ai,VME_IO,devAiXy566DiL,"XYCOM-566 Dif Latched")
device(ai,VME_IO,devAiDvx2502,"DVX-2502")
device(ai,CONSTANT,devAiTestAsyn,"Test Asyn")
device(ai,CONSTANT,devAiSymb,"vxWorks Variable")
device(ai,AB_IO,devAiAb1771Il,"AB-1771IL-Analog In")
device(ai,AB_IO,devAiAb1771Ife,"AB-1771IFE")
device(ai,AB_IO,devAiAb1771Ixe,"AB-1771IXE-Millivolt In")
device(ai,AB_IO,devAiAb1771IfeSe,"AB-1771IFE-SE")
device(ai,AB_IO,devAiAb1771IfeMa,"AB-1771IFE-4to20MA")
device(ai,AB_IO,devAiAb1771Ife0to5V,"AB-1771IFE-0to5Volt")
device(ai,AB_IO,devAiAb1771IrPlatinum,"AB-1771RTD-Platinum")
device(ai,AB_IO,devAiAb1771IrCopper,"AB-1771RTD-Copper")
#device(ai,CAMAC_IO,devAiCamac,"Camac")
device(ai,VME_IO,devAiAt5Vxi,"VXI-AT5-AI")
#device(ai,GPIB_IO,devAiK486Gpib,"Keithley-486")
#device(ai,VME_IO,devAiKscV215,"KSC-V215")
device(ai,VME_IO,devAiSysmon,"SYSMON")
#device(aai,CAMAC_IO,devAaiCamac,"Camac")
device(ao,CONSTANT,devAoSoft,"Soft Channel")
device(ao,CONSTANT,devAoSoftRaw,"Raw Soft Channel")
device(ao,VME_IO,devAoVmiVme4100,"VMIVME-4100")
device(ao,CONSTANT,devAoTestAsyn,"Test Asyn")
device(ao,CONSTANT,devAoSymb,"vxWorks Variable")
device(ao,AB_IO,devAoAb1771Ofe,"AB-1771OFE")
#device(ao,CAMAC_IO,devAoCamac,"Camac")
device(ao,VME_IO,devAoAt5Vxi,"VXI-AT5-AO")
device(bi,CONSTANT,devBiSoft,"Soft Channel")
device(bi,CONSTANT,devBiSoftRaw,"Raw Soft Channel")
device(bi,VME_IO,devBiMpv910,"MPV-910")
device(bi,VME_IO,devBiXVme210,"XVME-210")
device(bi,CONSTANT,devBiTestAsyn,"Test Asyn")
device(bi,AB_IO,devBiAb,"AB-Binary Input")
device(bi,AB_IO,devBiAb16,"AB-16 bit BI")
device(bi,AB_IO,devBiAb32,"AB-32 bit BI")
#device(bi,CAMAC_IO,devBiCamac,"Camac")
device(bi,VME_IO,devBiAt5Vxi,"VXI-AT5-BI")
#device(bi,VME_IO,devBiXy240,"XYCOM-240")
device(bi,VME_IO,devBiHpe1368a,"VXI-HPE1368-VS")
#device(bi,VME_IO,devBiAt8Fp,"AT8-FP10S")
device(bi,VME_IO,devBiAvme9440,"AVME9440 I")
device(bi,VME_IO,devBiSysmon,"SYSMON")
device(bi,VME_IO,devBiMpc,"MPC")
device(bo,CONSTANT,devBoSoft,"Soft Channel")
device(bo,CONSTANT,devBoSoftRaw,"Raw Soft Channel")
device(bo,VME_IO,devBoMpv902,"MPV-902")
device(bo,VME_IO,devBoXVme220,"XVME-220")
device(bo,CONSTANT,devBoTestAsyn,"Test Asyn")
device(bo,AB_IO,devBoAb,"AB-Binary Output")
device(bo,AB_IO,devBoAb16,"AB-16 bit BO")
device(bo,AB_IO,devBoAb32,"AB-32 bit BO")
#device(bo,CAMAC_IO,devBoCamac,"Camac")
device(bo,VME_IO,devBoAt5Vxi,"VXI-AT5-BO")
#device(bo,GPIB_IO,devBoK486Gpib,"Keithley-486")
#device(bo,VME_IO,devBoXy240,"XYCOM-240")
device(bo,VME_IO,devBoHpe1368a,"VXI-HPE1368-VS")
#device(bo,VME_IO,devBoAt8Fp,"AT8-FP10S")
device(bo,VME_IO,devBoAvme9440,"AVME9440 O")
device(bo,VME_IO,devBoSysmon,"SYSMON")
device(bo,VME_IO,devBoMpc,"MPC")
device(event,CONSTANT,devEventSoft,"Soft Channel")
device(event,VME_IO,devEventMz8310,"Mizar-8310")
device(event,CONSTANT,devEventTestIoEvent,"Test IoEvent")
device(event,VME_IO,devErEpicsEvent,"APS event receiver")
device(histogram,CONSTANT,devHistogramSoft,"Soft Channel")
device(histogram,CONSTANT,devHistogramTestAsyn,"Test Asyn")
device(longin,CONSTANT,devLiSoft,"Soft Channel")
device(longin,CONSTANT,devLiSymb,"vxWorks Variable")
#device(longin,CAMAC_IO,devLiCamac,"Camac")
device(longout,CONSTANT,devLoSoft,"Soft Channel")
device(longout,CONSTANT,devLoSymb,"vxWorks Variable")
#device(longout,CAMAC_IO,devLoCamac,"Camac")
device(mbbi,CONSTANT,devMbbiSoft,"Soft Channel")
device(mbbi,CONSTANT,devMbbiSoftRaw,"Raw Soft Channel")
device(mbbi,VME_IO,devMbbiMpv910,"MPV-910")
device(mbbi,VME_IO,devMbbiXVme210,"XVME-210")
device(mbbi,CONSTANT,devMbbiTestAsyn,"Test Asyn")
device(mbbi,AB_IO,devMbbiAb,"AB-Binary Input")
device(mbbi,AB_IO,devMbbiAb16,"AB-16 bit BI")
device(mbbi,AB_IO,devMbbiAb32,"AB-32 bit BI")
device(mbbi,AB_IO,devMbbiAbAdapterStat,"AB-Adapter Status")
device(mbbi,AB_IO,devMbbiAbCardStat,"AB-Card Status")
#device(mbbi,CAMAC_IO,devMbbiCamac,"Camac")
device(mbbi,VME_IO,devMbbiAt5Vxi,"VXI-AT5-BI")
#device(mbbi,VME_IO,devMbbiXy240,"XYCOM-240")
device(mbbi,VME_IO,devMbbiHpe1368a,"VXI-HPE1368-VS")
#device(mbbi,VME_IO,devMbbiAt8Fp,"AT8-FP10S")
device(mbbi,VME_IO,devMbbiAvme9440,"AVME9440 I")
device(mbbi,VME_IO,devMbbiSysmon,"SYSMON")
device(mbbiDirect,CONSTANT,devMbbiDirectSoft,"Soft Channel")
device(mbbiDirect,CONSTANT,devMbbiDirectSoftRaw,"Raw Soft Channel")
device(mbbiDirect,VME_IO,devMbbiDirectMpv910,"MPV-910")
device(mbbiDirect,VME_IO,devMbbiDirectXVme210,"XVME-210")
device(mbbiDirect,AB_IO,devMbbiDirectAb,"AB-Binary Input")
device(mbbiDirect,AB_IO,devMbbiDirectAb16,"AB-16 bit BI")
device(mbbiDirect,AB_IO,devMbbiDirectAb32,"AB-32 bit BI")
#device(mbbiDirect,CAMAC_IO,devMbbiDirectCamac,"Camac")
device(mbbiDirect,VME_IO,devMbbiDirectAt5Vxi,"VXI-AT5-BI")
device(mbbo,CONSTANT,devMbboSoft,"Soft Channel")
device(mbbo,CONSTANT,devMbboSoftRaw,"Raw Soft Channel")
device(mbbo,VME_IO,devMbboMpv902,"MPV-902")
device(mbbo,VME_IO,devMbboXVme220,"XVME-220")
device(mbbo,CONSTANT,devMbboTestAsyn,"Test Asyn")
device(mbbo,AB_IO,devMbboAb,"AB-Binary Output")
device(mbbo,AB_IO,devMbboAb16,"AB-16 bit BO")
device(mbbo,AB_IO,devMbboAb32,"AB-32 bit BO")
device(mbbo,VME_IO,devMbboAt5Vxi,"VXI-AT5-BO")
#device(mbbo,GPIB_IO,devMbboK486Gpib,"Keithley-486")
#device(mbbo,VME_IO,devMbboXy240,"XYCOM-240")
device(mbbo,VME_IO,devMbboHpe1368a,"VXI-HPE1368-VS")
#device(mbbo,VME_IO,devMbboAt8Fp,"AT8-FP10S")
device(mbbo,VME_IO,devMbboAvme9440,"AVME9440 O")
device(mbbo,VME_IO,devMbboSysmon,"SYSMON")
device(mbboDirect,CONSTANT,devMbboDirectSoft,"Soft Channel")
device(mbboDirect,CONSTANT,devMbboDirectSoftRaw,"Raw Soft Channel")
device(mbboDirect,VME_IO,devMbboDirectMpv902,"MPV-902")
device(mbboDirect,VME_IO,devMbboDirectXVme220,"XVME-220")
device(mbboDirect,AB_IO,devMbboDirectAb,"AB-Binary Output")
device(mbboDirect,AB_IO,devMbboDirectAb16,"AB-16 bit BO")
device(mbboDirect,AB_IO,devMbboDirectAb32,"AB-32 bit BO")
#device(mbboDirect,CAMAC_IO,devMbboDirectCamac,"Camac")
device(mbboDirect,VME_IO,devMbboDirectAt5Vxi,"VXI-AT5-BO")
device(pulseCounter,VME_IO,devPcMz8310,"Mizar-8310")
device(pulseDelay,VME_IO,devPdMz8310,"Mizar-8310")
device(pulseDelay,VXI_IO,devPdVxiTDM,"VXI Time Delay Module")
device(pulseTrain,CONSTANT,devPtSoft,"Soft Channel")
device(pulseTrain,VME_IO,devPtMz8310,"Mizar-8310")
device(steppermotor,VME_IO,devSmCompumotor1830,"Compumotor 1830")
device(steppermotor,VME_IO,devSmOms6Axis,"OMS 6-Axis")
device(stringin,CONSTANT,devSiSoft,"Soft Channel")
device(stringin,CONSTANT,devSiTestAsyn,"Test Asyn")
device(stringin,CONSTANT,devSiSymb,"vxWorks Variable")
device(stringout,CONSTANT,devSoSoft,"Soft Channel")
device(stringout,CONSTANT,devSoTestAsyn,"Test Asyn")
device(stringout,CONSTANT,devSoSymb,"vxWorks Variable")
device(subArray,CONSTANT,devSASoft,"Soft Channel")
device(timer,VME_IO,devTmMizar8310,"Mizar-8310")
device(timer,VME_IO,devTmDg535,"DG 535")
device(timer,VME_IO,devTmAt5Vxi,"VXI-AT5-TIME")
device(waveform,CONSTANT,devWfSoft,"Soft Channel")
device(waveform,VME_IO,devWfXy566Sc,"XYCOM-566 Single Channel")
device(waveform,VME_IO,devWfComet,"Comet Digitizer")
device(waveform,VME_IO,devWfJoergerVtr1,"Joerger Digitizer")
device(waveform,CONSTANT,devWfTestAsyn,"Test Asyn")
device(waveform,VME_IO,devWfDvx2502,"DVX-2502")
device(waveform,VME_IO,devWfPentek4261,"Pentek 4261")
#device(waveform,CAMAC_IO,devWfCamac,"Camac")
#device(waveform,VME_IO,devWfJoergerVtr1,"Joerger-VTR1")
#device(waveform,VME_IO,devWfComet,"Omnibyte-COMET")
device(eg,VME_IO,devEg,"APS event generator G")
device(egevent,VME_IO,devEgEvent,"APS event generator E")
device(er,VME_IO,devEr,"APS event receiver")
device(erevent,VME_IO,devErevent,"APS event receiver")
device(wait,CONSTANT,devWaitIoEvent,"Soft Channel")
#device(ai,INST_IO,devAiCan,"CANbus")
#device(ao,INST_IO,devAoCan,"CANbus")
#device(bi,INST_IO,devBiCan,"CANbus")
#device(bo,INST_IO,devBoCan,"CANbus")
#device(mbbi,INST_IO,devMbbiCan,"CANbus")
#device(mbbo,INST_IO,devMbboCan,"CANbus")
#device(mbbiDirect,INST_IO,devMbbiDirectCan,"CANbus")
#device(mbboDirect,INST_IO,devMbboDirectCan,"CANbus")
driver(drvXy010)
driver(drvVxi)
driver(drvGpib)
driver(drvBitBus)
driver(drvBb910)
driver(drvXy210)
driver(drvBb902)
driver(drvXy220)
driver(drvXy566)
driver(drvDvx)
driver(drvVmi4100)
driver(drvAb)
driver(drvAt5Vxi)
driver(drvCompuSm)
driver(drvOms)
driver(drvMz8310)
driver(drvHpe1368a)
#driver(drvXy240)
#driver(drvKscV215)
#driver(drvComet)
#driver(drvJgvtr1)
#driver(drvFp)
#driver(drvFpm)
#driver(drvIpac)
#driver(drvTip810)

View File

@@ -1,34 +0,0 @@
b [a-zA-Z0-9_]
a [ \t]
d [a-zA-Z0-9_\,\./\*#\[\]%:;!|\'\-&\(\)@\?\+<>=$\^\~]
%{
yyreset()
{
line_num=1;
BEGIN INITIAL;
return(0);
}
%}
%%
^[A-Z0-9_]+ { yylval.Str=(char *)malloc(strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(FIELD); }
^"PV:" { return(PV); }
"Type:" { return(TYPE); }
" " { return(CLOSE); }
"$$end" { return(CLOSE); }
{d}+ { yylval.Str=(char *)malloc(strlen(yytext)+1);
strcpy(yylval.Str,yytext);
return(WORD); }
. ;
\n { line_num++; }
%%

View File

@@ -1,135 +0,0 @@
%{
#include <stdio.h>
#include <memory.h>
#include <string.h>
static int yy_start;
#include <dbStaticLib.h>
/* kludge for buggy lex/yacc. exploits the fact that we know the union */
/* below will be given the name YYSTYPE. done so that ifndef YYSTYPE */
/* (as it appears in pdb.c) fails */
#define YYSTYPE OUR_YYSTYPE
int line_num;
extern DBENTRY *pdbentry;
char rectype[100];
char recname[100];
char curr_field[10];
char curr_value[200];
char message[200];
long status;
#ifdef __STDC__
static void printMessage(char *mess) {
#else
static void printMessage(mess)
char *mess;
{
#endif /*__STDC__*/
sprintf(message,"%s Error near line %d Type: %s Name: %s Field: %s Value: %s",
mess,line_num,rectype,recname,curr_field,curr_value);
errMessage(status,message);
}
%}
%start conv
%token <Str> WORD
%token <Str> FIELD
%token <Str> TYPE
%token <Str> PV CLOSE
%union
{
int Int;
char Char;
char *Str;
double Real;
}
%%
conv: things
;
things:
| things thing
;
thing: header fields CLOSE
| header CLOSE
| junko
;
header: PV WORD TYPE WORD WORD
{
strcpy(rectype,$4);
strcpy(recname,$2);
status = dbFindRecdes(pdbentry,rectype);
if(status) printMessage("dbFindRecdes");
status = dbCreateRecord(pdbentry,recname);
if(status) printMessage("dbCreateRecord");
}
header: PV WORD TYPE WORD
{
strcpy(rectype,$4);
strcpy(recname,$2);
status = dbFindRecdes(pdbentry,rectype);
if(status) printMessage("dbFindRecdes");
status = dbCreateRecord(pdbentry,recname);
if(status) printMessage("dbCreateRecord");
}
fields: field
| fields field
;
field: f_name words
{
status = dbPutString(pdbentry,curr_value);
if(status) printMessage("dbPutString");
}
;
f_name: FIELD
{
curr_value[0]='\0';
strcpy(curr_field,$1);
status = dbFindField(pdbentry,$1);
if(status) printMessage("dbFindField");
}
;
words:
| words WORD
{
char* p;
/* pretty crappy stuff */
if((p=strstr($2,".PP.MS"))) {p[0]=' ';p[3]=' ';}
else if((p=strstr($2,".PP.NMS"))) {p[0]=' ';p[3]=' ';}
else if((p=strstr($2,".NPP.MS"))) {p[0]=' ';p[4]=' ';}
else if((p=strstr($2,".NPP.NMS"))) {p[0]=' ';p[4]=' ';}
else if(strlen(curr_value)>0) { strcat(curr_value," "); }
strcat(curr_value,$2);
}
;
junko: WORD
| CLOSE
;
%%
#include "atdb_lex.c"
yyerror(str)
char *str;
{
sprintf(message,"Error line %d : %s %s\n",line_num, yytext,str);
errMessage(-1,message);
}
#include "atdb.c"

View File

@@ -47,6 +47,7 @@
#include <recSup.h>
#include <taskwd.h>
#include <errMdef.h>
#include <dbCommon.h>
#include <task_params.h>
#define QUEUESIZE 1000
@@ -169,14 +170,16 @@ static void wdCallback(long ind)
static void ProcessCallback(CALLBACK *pCallback)
{
struct dbCommon *pRec;
dbCommon *pRec = NULL;
struct rset *prset = (struct rset *)pRec->rset;
callbackGetUser(pRec, pCallback);
dbScanLock(pRec);
((struct rset*)(pRec->rset))->process(pRec);
(*prset->process)(pRec);
dbScanUnlock(pRec);
}
void callbackRequestProcessCallback(CALLBACK *pCallback, int Priority, void *pRec)
void callbackRequestProcessCallback(CALLBACK *pCallback,
int Priority, void *pRec)
{
callbackSetCallback(ProcessCallback, pCallback);
callbackSetPriority(Priority, pCallback);

File diff suppressed because it is too large Load Diff

View File

@@ -28,6 +28,9 @@
* Modification Log:
* -----------------
* $Log$
* Revision 1.5 1995/02/23 21:45:03 mcn
* Fixed locking error. OOPS.
*
*/
/*
@@ -68,20 +71,17 @@
#include <fast_lock.h>
#include <alarm.h>
#include <choice.h>
#include <dbDefs.h>
#include <dbBase.h>
#include <dbAccess.h>
#include <dbScan.h>
#include <dbCommon.h>
#include <dbFldTypes.h>
#include <dbRecDes.h>
#include <dbRecType.h>
#include <dbRecords.h>
#include <dbBkpt.h>
#include <db_field_log.h>
#include <errMdef.h>
#include <recSup.h>
#include <recGbl.h>
#include <special.h>
#include <task_params.h>

View File

@@ -51,6 +51,7 @@
/* needed for PVNAME_SZ and FLDNAME_SZ ... must be before dbAccess.h */
#include <dbDefs.h>
#include <recGbl.h>
/* needed for dbNameToAddr() */
#include <dbAccess.h>
@@ -88,11 +89,9 @@
((DBF) == DBF_FLOAT ? DBR_FLOAT : \
((DBF) == DBF_DOUBLE ? DBR_DOUBLE : \
((DBF) == DBF_ENUM ? DBR_ENUM : \
((DBF) == DBF_GBLCHOICE ? DBR_ENUM : \
((DBF) == DBF_CVTCHOICE ? DBR_ENUM : \
((DBF) == DBF_RECCHOICE ? DBR_ENUM : \
((DBF) == DBF_DEVCHOICE ? DBR_ENUM : \
INVALID_DBF ))))))))))))))
((DBF) == DBF_MENU ? DBR_ENUM : \
((DBF) == DBF_DEVICE ? DBR_ENUM : \
INVALID_DBF ))))))))))))
/* this macro should be in recSup.h */
/* to hide the fact that the precord */

View File

@@ -308,14 +308,8 @@ long rc;
/* moving source name */
/* into struct input_pvar */
strncpy(pi->source_name,
plink->value.pv_link.pvname,
PVNAME_SZ);
pi->source_name[PVNAME_SZ] = '\0';
strcat(pi->source_name, ".");
strncat(pi->source_name,
plink->value.pv_link.fldname,
FLDNAME_SZ);
strcpy(pi->source_name,
plink->value.pv_link.pvname);
/* preserving MS/NMS specification */
if (plink->value.pv_link.maximize_sevr)
@@ -511,15 +505,8 @@ long rc;
/* moving dest name into */
/* struct output_pvar */
strncpy(po->dest_name,
plink->value.pv_link.pvname,
PVNAME_SZ);
po->dest_name[PVNAME_SZ] = '\0';
strcat(po->dest_name, ".");
strncat(po->dest_name,
plink->value.pv_link.fldname,
FLDNAME_SZ);
strcpy(po->dest_name,
plink->value.pv_link.pvname);
/* for dbGet() */
po->source_new_dbr_type =
dbCaNewDbfToNewDbr(

246
src/db/dbCommon.ascii Normal file
View File

@@ -0,0 +1,246 @@
field(NAME,DBF_STRING) {
prompt("Record Name")
special(SPC_NOMOD)
size(29)
}
field(DESC,DBF_STRING) {
prompt("Descriptor")
promptgroup(GUI_COMMON)
size(29)
}
field(ASG,DBF_STRING) {
prompt("Access Security Group")
promptgroup(GUI_COMMON)
special(SPC_AS)
size(29)
}
field(SCAN,DBF_MENU) {
prompt("Scan Mechanism")
promptgroup(GUI_SCAN)
special(SPC_SCAN)
interest(1)
menu(menuScan)
}
field(PINI,DBF_MENU) {
prompt("Process at iocInit")
promptgroup(GUI_SCAN)
interest(1)
menu(menuYesNo)
}
field(PHAS,DBF_SHORT) {
prompt("Scan Phase")
promptgroup(GUI_SCAN)
special(SPC_SCAN)
interest(1)
}
field(EVNT,DBF_SHORT) {
prompt("Event Number")
promptgroup(GUI_SCAN)
special(SPC_SCAN)
interest(1)
}
field(TSE,DBF_SHORT) {
prompt("Time Stamp Event")
interest(1)
}
field(TSEL,DBF_INLINK) {
prompt("Time Stamp Link")
promptgroup(GUI_SCAN)
special(SPC_NOMOD)
interest(1)
}
field(DTYP,DBF_DEVICE) {
prompt("Device Type")
promptgroup(GUI_LINKS)
special(SPC_NOMOD)
interest(1)
}
field(DISV,DBF_SHORT) {
prompt("Disable Value")
promptgroup(GUI_SCAN)
initial("1")
}
field(DISA,DBF_SHORT) {
prompt("Disable")
}
field(SDIS,DBF_INLINK) {
prompt("Scanning Disable")
promptgroup(GUI_SCAN)
special(SPC_NOMOD)
interest(1)
}
field(MLOK,DBF_NOACCESS) {
prompt("Monitor fastlock")
special(SPC_NOMOD)
interest(4)
size(8)
extra("FAST_LOCK mlok")
}
field(MLIS,DBF_NOACCESS) {
prompt("Monitor List")
special(SPC_NOMOD)
interest(4)
size(12)
extra("ELLLIST mlis")
}
field(DISP,DBF_UCHAR) {
prompt("Disable putField")
}
field(PROC,DBF_UCHAR) {
prompt("Force Processing")
pp(TRUE)
interest(3)
}
field(STAT,DBF_MENU) {
prompt("Alarm Status")
special(SPC_NOMOD)
menu(menuAlarmStat)
initial("17")
}
field(SEVR,DBF_MENU) {
prompt("Alarm Severity")
special(SPC_NOMOD)
menu(menuAlarmSevr)
initial("3")
}
field(NSTA,DBF_MENU) {
prompt("New Alarm Status")
special(SPC_NOMOD)
interest(2)
menu(menuAlarmStat)
}
field(NSEV,DBF_MENU) {
prompt("New Alarm Severity")
special(SPC_NOMOD)
interest(2)
menu(menuAlarmSevr)
}
field(ACKS,DBF_MENU) {
prompt("Alarm Ack Severity")
special(SPC_NOMOD)
interest(2)
menu(menuAlarmSevr)
}
field(ACKT,DBF_MENU) {
prompt("Alarm Ack Transient")
special(SPC_NOMOD)
interest(2)
menu(menuYesNo)
initial("1")
}
field(DISS,DBF_MENU) {
prompt("Disable Alarm Sevrty")
promptgroup(GUI_SCAN)
interest(1)
menu(menuAlarmSevr)
}
field(LSET,DBF_SHORT) {
prompt("Lock Set")
special(SPC_NOMOD)
interest(4)
}
field(LCNT,DBF_UCHAR) {
prompt("Lock Count")
special(SPC_NOMOD)
interest(2)
}
field(PACT,DBF_UCHAR) {
prompt("Record active")
special(SPC_NOMOD)
interest(1)
}
field(PUTF,DBF_UCHAR) {
prompt("dbPutField process")
special(SPC_NOMOD)
interest(1)
}
field(RPRO,DBF_UCHAR) {
prompt("Reprocess ")
special(SPC_NOMOD)
interest(1)
}
field(ASP,DBF_NOACCESS) {
prompt("Access Security Pvt")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *asp")
}
field(PPN,DBF_NOACCESS) {
prompt("addr of PUTNOTIFY")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *ppn")
}
field(PPNN,DBF_NOACCESS) {
prompt("next record PUTNOTIFY")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *ppnn")
}
field(SPVT,DBF_NOACCESS) {
prompt("Scan Private")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *spvt")
}
field(RSET,DBF_NOACCESS) {
prompt("Address of RSET")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *rset")
}
field(DSET,DBF_NOACCESS) {
prompt("DSET address")
special(SPC_NOMOD)
interest(4)
size(4)
extra("struct dset *dset")
}
field(DPVT,DBF_NOACCESS) {
prompt("Device Private")
special(SPC_NOMOD)
interest(4)
size(4)
extra("void *dpvt")
}
field(PRIO,DBF_MENU) {
prompt("Scheduling Priority")
promptgroup(GUI_SCAN)
special(SPC_SCAN)
interest(1)
menu(menuPriority)
}
field(TPRO,DBF_UCHAR) {
prompt("Trace Processing")
}
field(BKPT,DBF_NOACCESS) {
prompt("Break Point")
special(SPC_NOMOD)
interest(1)
size(1)
extra("char bkpt")
}
field(UDF,DBF_UCHAR) {
prompt("Undefined")
pp(TRUE)
interest(1)
initial("1")
}
field(TIME,DBF_NOACCESS) {
prompt("Time")
special(SPC_NOMOD)
interest(4)
size(8)
extra("TS_STAMP time")
}
field(FLNK,DBF_FWDLINK) {
prompt("Forward Process Link")
promptgroup(GUI_LINKS)
special(SPC_NOMOD)
interest(1)
}

View File

@@ -0,0 +1,3 @@
recordtype(dbCommon) {
include "dbCommon.ascii"
}

File diff suppressed because it is too large Load Diff

View File

@@ -622,14 +622,16 @@ int db_post_single_event(struct event_block *pevent)
*
*/
int db_post_events(
struct dbCommon *precord,
union native_value *pvalue,
unsigned int select
void *prec,
void *pval,
unsigned int select
)
{
struct event_block *event;
struct event_que *ev_que;
unsigned int putix;
struct dbCommon *precord = (struct dbCommon *)prec;
union native_value *pvalue = (union native_value *)pval;
struct event_block *event;
struct event_que *ev_que;
unsigned int putix;
if (precord->mlis.count == 0) return OK; /* no monitors set */

View File

@@ -41,22 +41,21 @@
#include <fast_lock.h>
#include <cvtFast.h>
#include <alarm.h>
#include <choice.h>
#include <dbDefs.h>
#include <dbBase.h>
#include <dbAccess.h>
#include <dbConvert.h>
#include <dbStaticLib.h>
#include <dbScan.h>
#include <dbCommon.h>
#include <dbFldTypes.h>
#include <dbRecDes.h>
#include <dbRecType.h>
#include <db_field_log.h>
#include <errMdef.h>
#include <recSup.h>
#include <recGbl.h>
#include <special.h>
extern struct dbBase *pdbBase;
extern struct dbBase *pdbbase;
/*
* In the following functions:
@@ -92,7 +91,7 @@ long cvt_uninit(
void *to,
struct dbAddr *paddr)
{
printf("Error in record support, uninitialized link.\n");
recGblDbaddrError(-1,paddr,"cvt_uninit: uninitialized link");
return(-1);
}
@@ -261,7 +260,7 @@ static long cvt_st_e(
struct rset *prset;
long status;
prset = GET_PRSET(pdbBase->precSup, paddr->record_type);
prset = dbGetRset(paddr);
if (prset && prset->put_enum_str)
return (*prset->put_enum_str)(paddr, from);
@@ -271,121 +270,69 @@ static long cvt_st_e(
return(S_db_badDbrtype);
}
/* Convert String to Global Choice */
static long cvt_st_gbl(
/* Convert String to Menu */
static long cvt_st_menu(
char *from,
unsigned short *to,
struct dbAddr *paddr)
{
char *pchoice;
struct choiceSet *pchoiceSet;
unsigned short i;
{
dbFldDes *pdbFldDes = (dbFldDes *)paddr->pfldDes;
dbMenu *pdbMenu = (dbMenu *)pdbFldDes->ftPvt;
char **papChoiceValue;
char *pchoice;
unsigned int nChoice,ind;
int nargs,nchars;
pchoiceSet = GET_PCHOICE_SET(pdbBase->pchoiceGbl, paddr->choice_set);
if( pdbMenu && (papChoiceValue = pdbMenu->papChoiceValue)) {
nChoice = pdbMenu->nChoice;
for(ind=0; ind<nChoice; ind++) {
if(!(pchoice=papChoiceValue[ind])) continue;
if(strcmp(pchoice,from)==0) {
*to = ind;
return(0);
}
}
nargs = sscanf(from," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(from) && ind<nChoice) {
*to = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbFastLinkConv(cvt_st_menu)");
return(S_db_badChoice);
}
if (pchoiceSet) {
for (i=0; i < pchoiceSet->number; i++) {
pchoice = pchoiceSet->papChoice[i];
if (!pchoice)
continue;
if (strcmp(pchoice, from) == 0) {
*to = i;
return(0);
}
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbPut(putStringGchoice)");
return(S_db_badChoice);
}
/* Convert String to Cvt Choice */
static long cvt_st_cvt(
/* Convert String to Device */
static long cvt_st_device(
char *from,
unsigned short *to,
struct dbAddr *paddr)
{
char *pchoice;
struct choiceSet *pchoiceSet;
unsigned short i;
{
dbFldDes *pdbFldDes = (dbFldDes *)paddr->pfldDes;
dbDeviceMenu *pdbDeviceMenu = (dbDeviceMenu *)pdbFldDes->ftPvt;
char **papChoice;
char *pchoice;
unsigned int nChoice,ind;
int nargs,nchars;
pchoiceSet = pdbBase->pchoiceCvt;
if (pchoiceSet) {
for (i=0; i < pchoiceSet->number; i++) {
pchoice = pchoiceSet->papChoice[i];
if (!pchoice)
continue;
if (strcmp(pchoice, from) == 0) {
*to = i;
return(0);
}
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbPut(putStringCchoice)");
return(S_db_badChoice);
}
/* Convert String to Rec Choice */
static long cvt_st_rec(
char *from,
unsigned short *to,
struct dbAddr *paddr)
{
char *pchoice;
struct choiceSet *pchoiceSet;
struct arrChoiceSet *parrChoiceSet;
unsigned short i;
parrChoiceSet = GET_PARR_CHOICE_SET(pdbBase->pchoiceRec, paddr->record_type);
if (parrChoiceSet) {
pchoiceSet = GET_PCHOICE_SET(parrChoiceSet, paddr->choice_set);
if (pchoiceSet) {
for (i=0; i < pchoiceSet->number; i++) {
pchoice = pchoiceSet->papChoice[i];
if (!pchoice)
continue;
if (strcmp(pchoice, from) == 0) {
*to = i;
return(0);
}
}
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbPut(putStringRchoice)");
return(S_db_badChoice);
}
/* Convert String to Dev Choice */
static long cvt_st_dev(
char *from,
unsigned short *to,
struct dbAddr *paddr)
{
char *pchoice;
struct devChoiceSet *pdevChoiceSet;
unsigned short i;
pdevChoiceSet = GET_PDEV_CHOICE_SET(pdbBase->pchoiceDev, paddr->record_type);
if (pdevChoiceSet) {
for (i=0; i < pdevChoiceSet->number; i++) {
pchoice = pdevChoiceSet->papDevChoice[i]->pchoice;
if (!pchoice)
continue;
if (strcmp(pchoice, from) == 0) {
*to = i;
return(0);
}
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbPut(putStringDchoice)");
return(S_db_badChoice);
}
if( pdbDeviceMenu && (papChoice = pdbDeviceMenu->papChoice)) {
nChoice = pdbDeviceMenu->nChoice;
for(ind=0; ind<nChoice; ind++) {
if(!(pchoice=papChoice[ind])) continue;
if(strcmp(pchoice,from)==0) {
*to = ind;
return(0);
}
}
nargs = sscanf(from," %u %n",&ind,&nchars);
if(nargs==1 && nchars==strlen(from) && ind<nChoice) {
*to = ind;
return(0);
}
}
recGblDbaddrError(S_db_badChoice,paddr,"dbFastLinkConv(cvt_st_device)");
return(S_db_badChoice);
}
/* Convert Char to String */
static long cvt_c_st(
@@ -817,7 +764,7 @@ static long cvt_f_st(
long status = 0;
long precision = 2;
prset = GET_PRSET(pdbBase->precSup, paddr->record_type);
prset = dbGetRset(paddr);
if (prset && prset->get_precision)
(*prset->get_precision)(paddr, &precision);
@@ -907,7 +854,7 @@ static long cvt_d_st(
long status = 0;
long precision = 2;
prset = GET_PRSET(pdbBase->precSup, paddr->record_type);
prset = dbGetRset(paddr);
if (prset && prset->get_precision)
(*prset->get_precision)(paddr, &precision);
@@ -1061,7 +1008,7 @@ static long cvt_e_st_get(
struct rset *prset;
long status;
prset = GET_PRSET(pdbBase->precSup, paddr->record_type);
prset = dbGetRset(paddr);
if (prset && prset->get_enum_str)
return (*prset->get_enum_str)(paddr, to);
@@ -1079,100 +1026,47 @@ static long cvt_e_st_put(
struct dbAddr *paddr)
{ cvtUshortToString(*from, to); return(0); }
/* Get Gbl Choice to String */
static long cvt_gbl_st(
/* Get Menu to String */
static long cvt_menu_st(
unsigned short *from,
char *to,
struct dbAddr *paddr)
{
struct choiceSet *pchoiceSet;
char *pchoice;
dbFldDes *pdbFldDes = (dbFldDes *)paddr->pfldDes;
dbMenu *pdbMenu = (dbMenu *)pdbFldDes->ftPvt;
char **papChoiceValue;
char *pchoice;
pchoiceSet = GET_PCHOICE_SET(pdbBase->pchoiceGbl, paddr->choice_set);
if (pchoiceSet) {
pchoice = GET_CHOICE(pchoiceSet, *from);
if (pchoice) {
strncpy(to, pchoice, MAX_STRING_SIZE);
return(0);
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbGetField(getGchoiceString)");
return(S_db_badChoice);
if( !pdbMenu || *from>=pdbMenu->nChoice
|| !(papChoiceValue = pdbMenu->papChoiceValue)
|| !(pchoice=papChoiceValue[*from])) {
recGblDbaddrError(S_db_badChoice,paddr,"dbFastLinkConv(cvt_menu_st)");
return(S_db_badChoice);
}
strncpy(to,pchoice,MAX_STRING_SIZE);
return(0);
}
/* Get Cvt Choice to String */
static long cvt_cvt_st(
/* Get Device to String */
static long cvt_device_st(
unsigned short *from,
char *to,
struct dbAddr *paddr)
{
char *pchoice;
dbFldDes *pdbFldDes = (dbFldDes *)paddr->pfldDes;
dbDeviceMenu *pdbDeviceMenu = (dbDeviceMenu *)pdbFldDes->ftPvt;
char **papChoice;
char *pchoice;
pchoice = GET_CHOICE(pdbBase->pchoiceCvt, *from);
if (pchoice) {
strncpy(to, pchoice, MAX_STRING_SIZE);
return(0);
}
recGblDbaddrError(S_db_badChoice, paddr, "dbGetField(getCchoiceString)");
return(S_db_badChoice);
}
/* Get Record Choice to String */
static long cvt_rec_st(
unsigned short *from,
char *to,
struct dbAddr *paddr)
{
struct choiceSet *pchoiceSet;
struct arrChoiceSet *parrChoiceSet;
char *pchoice;
parrChoiceSet = GET_PARR_CHOICE_SET(pdbBase->pchoiceRec, paddr->record_type);
if (parrChoiceSet) {
pchoiceSet = GET_PCHOICE_SET(parrChoiceSet, paddr->choice_set);
if (pchoiceSet) {
pchoice = GET_CHOICE(pchoiceSet, *from);
if (pchoice) {
strncpy(to, pchoice, MAX_STRING_SIZE);
return(0);
}
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbGetField(getRchoiceString)");
return(S_db_badChoice);
}
/* Get Dev Choice to String */
static long cvt_dev_st(
unsigned short *from,
char *to,
struct dbAddr *paddr)
{
struct devChoiceSet *pdevChoiceSet;
struct devChoice *pdevChoice;
pdevChoiceSet = GET_PDEV_CHOICE_SET(pdbBase->pchoiceDev, paddr->record_type);
if (pdevChoiceSet) {
pdevChoice = GET_DEV_CHOICE(pdevChoiceSet, *from);
if (pdevChoice) {
strncpy(to, pdevChoice->pchoice, MAX_STRING_SIZE);
return(0);
}
}
recGblDbaddrError(S_db_badChoice, paddr, "dbGetField(getRchoiceString)");
return(S_db_badChoice);
if( !pdbDeviceMenu || *from>=pdbDeviceMenu->nChoice
|| !(papChoice= pdbDeviceMenu->papChoice)
|| !(pchoice=papChoice[*from])) {
recGblDbaddrError(S_db_badChoice,paddr,"dbFastLinkConv(cvt_device_st)");
return(S_db_badChoice);
}
strncpy(to,pchoice,MAX_STRING_SIZE);
return(0);
}
/*
@@ -1186,7 +1080,7 @@ static long cvt_dev_st(
* NULL implies the conversion is not supported.
*/
long (*get_cvt_table[DBF_DEVCHOICE+1][DBR_ENUM+1])() = {
long (*dbFastGetConvertRoutine[DBF_DEVICE+1][DBR_ENUM+1])() = {
/* Convert DBF_STRING to ... */
{ cvt_st_st, cvt_st_c, cvt_st_uc, cvt_st_s, cvt_st_us, cvt_st_l, cvt_st_ul, cvt_st_f, cvt_st_d, cvt_st_e },
@@ -1218,17 +1112,11 @@ long (*get_cvt_table[DBF_DEVCHOICE+1][DBR_ENUM+1])() = {
/* Convert DBF_ENUM to ... */
{ cvt_e_st_get, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e },
/* Convert DBF_GBLCHOICE to ... */
{ cvt_gbl_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e },
/* Convert DBF_MENU to ... */
{ cvt_menu_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e },
/* Convert DBF_CVTCHOICE to ... */
{ cvt_cvt_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e },
/* Convert DBF_RECCHOICE to ... */
{ cvt_rec_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e },
/* Convert DBF_DEVCHOICE to ... */
{ cvt_dev_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e } };
/* Convert DBF_DEVICE to ... */
{ cvt_device_st, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e } };
/*
* Put conversion routine lookup table
@@ -1237,40 +1125,40 @@ long (*get_cvt_table[DBF_DEVCHOICE+1][DBR_ENUM+1])() = {
*
* DBF_STRING DBF_CHAR DBF_UCHAR DBF_SHORT DBF_USHORT
* DBF_LONG DBF_ULONG DBF_FLOAT DBF_DOUBLE DBF_ENUM
* DBF_GBLCHOICE DBF_CVTCHOICE DBF_RECCHOICE DBF_DEVCHOICE
* DBF_MENU DBF_DEVICE
*
* NULL implies the conversion is not supported.
*/
long (*put_cvt_table[DBR_ENUM+1][DBF_DEVCHOICE+1])() = {
long (*dbFastPutConvertRoutine[DBR_ENUM+1][DBF_DEVICE+1])() = {
/* Convert DBR_STRING to ... */
{ cvt_st_st, cvt_st_c, cvt_st_uc, cvt_st_s, cvt_st_us, cvt_st_l, cvt_st_ul, cvt_st_f, cvt_st_d, cvt_st_e, cvt_st_gbl, cvt_st_cvt, cvt_st_rec, cvt_st_dev },
{ cvt_st_st, cvt_st_c, cvt_st_uc, cvt_st_s, cvt_st_us, cvt_st_l, cvt_st_ul, cvt_st_f, cvt_st_d, cvt_st_e, cvt_st_menu, cvt_st_device},
/* Convert DBR_CHAR to ... */
{ cvt_c_st, cvt_c_c, cvt_c_uc, cvt_c_s, cvt_c_us, cvt_c_l, cvt_c_ul, cvt_c_f, cvt_c_d, cvt_c_e, cvt_c_e, cvt_c_e, cvt_c_e, cvt_c_e },
{ cvt_c_st, cvt_c_c, cvt_c_uc, cvt_c_s, cvt_c_us, cvt_c_l, cvt_c_ul, cvt_c_f, cvt_c_d, cvt_c_e, cvt_c_e, cvt_c_e},
/* Convert DBR_UCHAR to ... */
{ cvt_uc_st, cvt_uc_c, cvt_uc_uc, cvt_uc_s, cvt_uc_us, cvt_uc_l, cvt_uc_ul, cvt_uc_f, cvt_uc_d, cvt_uc_e, cvt_uc_e, cvt_uc_e, cvt_uc_e, cvt_uc_e },
{ cvt_uc_st, cvt_uc_c, cvt_uc_uc, cvt_uc_s, cvt_uc_us, cvt_uc_l, cvt_uc_ul, cvt_uc_f, cvt_uc_d, cvt_uc_e, cvt_uc_e, cvt_uc_e},
/* Convert DBR_SHORT to ... */
{ cvt_s_st, cvt_s_c, cvt_s_uc, cvt_s_s, cvt_s_us, cvt_s_l, cvt_s_ul, cvt_s_f, cvt_s_d, cvt_s_e, cvt_s_e, cvt_s_e, cvt_s_e, cvt_s_e },
{ cvt_s_st, cvt_s_c, cvt_s_uc, cvt_s_s, cvt_s_us, cvt_s_l, cvt_s_ul, cvt_s_f, cvt_s_d, cvt_s_e, cvt_s_e, cvt_s_e},
/* Convert DBR_USHORT to ... */
{ cvt_us_st, cvt_us_c, cvt_us_uc, cvt_us_s, cvt_us_us, cvt_us_l, cvt_us_ul, cvt_us_f, cvt_us_d, cvt_us_e, cvt_us_e, cvt_us_e, cvt_us_e, cvt_us_e },
{ cvt_us_st, cvt_us_c, cvt_us_uc, cvt_us_s, cvt_us_us, cvt_us_l, cvt_us_ul, cvt_us_f, cvt_us_d, cvt_us_e, cvt_us_e, cvt_us_e},
/* Convert DBR_LONG to ... */
{ cvt_l_st, cvt_l_c, cvt_l_uc, cvt_l_s, cvt_l_us, cvt_l_l, cvt_l_ul, cvt_l_f, cvt_l_d, cvt_l_e, cvt_l_e, cvt_l_e, cvt_l_e, cvt_l_e },
{ cvt_l_st, cvt_l_c, cvt_l_uc, cvt_l_s, cvt_l_us, cvt_l_l, cvt_l_ul, cvt_l_f, cvt_l_d, cvt_l_e, cvt_l_e, cvt_l_e},
/* Convert DBR_ULONG to ... */
{ cvt_ul_st, cvt_ul_c, cvt_ul_uc, cvt_ul_s, cvt_ul_us, cvt_ul_l, cvt_ul_ul, cvt_ul_f, cvt_ul_d, cvt_ul_e, cvt_ul_e, cvt_ul_e, cvt_ul_e, cvt_ul_e },
{ cvt_ul_st, cvt_ul_c, cvt_ul_uc, cvt_ul_s, cvt_ul_us, cvt_ul_l, cvt_ul_ul, cvt_ul_f, cvt_ul_d, cvt_ul_e, cvt_ul_e, cvt_ul_e},
/* Convert DBR_FLOAT to ... */
{ cvt_f_st, cvt_f_c, cvt_f_uc, cvt_f_s, cvt_f_us, cvt_f_l, cvt_f_ul, cvt_f_f, cvt_f_d, cvt_f_e, cvt_f_e, cvt_f_e, cvt_f_e, cvt_f_e },
{ cvt_f_st, cvt_f_c, cvt_f_uc, cvt_f_s, cvt_f_us, cvt_f_l, cvt_f_ul, cvt_f_f, cvt_f_d, cvt_f_e, cvt_f_e, cvt_f_e},
/* Convert DBR_DOUBLE to ... */
{ cvt_d_st, cvt_d_c, cvt_d_uc, cvt_d_s, cvt_d_us, cvt_d_l, cvt_d_ul, cvt_d_f, cvt_d_d, cvt_d_e, cvt_d_e, cvt_d_e, cvt_d_e, cvt_d_e },
{ cvt_d_st, cvt_d_c, cvt_d_uc, cvt_d_s, cvt_d_us, cvt_d_l, cvt_d_ul, cvt_d_f, cvt_d_d, cvt_d_e, cvt_d_e, cvt_d_e},
/* Convert DBR_ENUM to ... */
{ cvt_e_st_put, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e, cvt_e_e, cvt_e_e, cvt_e_e, cvt_e_e } };
{ cvt_e_st_put, cvt_e_c, cvt_e_uc, cvt_e_s, cvt_e_us, cvt_e_l, cvt_e_ul, cvt_e_f, cvt_e_d, cvt_e_e, cvt_e_e, cvt_e_e} };

View File

@@ -35,7 +35,10 @@
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#include <taskLib.h>
#include <semLib.h>
#include <sysLib.h>
#include <dbDefs.h>
#include <fast_lock.h>
@@ -45,185 +48,326 @@
#include <dbScan.h>
#include <dbCommon.h>
#include <errMdef.h>
#include <ellLib.h>
#include <recGbl.h>
/*NODE structure attached to ppnn field of each record in list*/
typedef struct {
ELLNODE node;
struct dbCommon *precord;
} PNWAITNODE;
/*Local routines*/
static void restartAdd(PUTNOTIFY *ppnto, PUTNOTIFY *ppnfrom);
static void waitAdd(struct dbCommon *precord,PUTNOTIFY *ppn);
static long putNotify(PUTNOTIFY *ppn);
static void notifyCallback(CALLBACK *pcallback);
static void notifyCancel(PUTNOTIFY *ppn);
static void issueCallback(PUTNOTIFY *ppn);
/*callbackState values */
typedef enum {
callbackNotActive,callbackActive,callbackCanceled}callbackState;
static void notifyCallback(CALLBACK *pcallback)
{
PUTNOTIFY *ppn=NULL;
long status;
/* This module provides code to handle put notify. If a put causes a record to
* be processed, then a user supplied callback is called when that record
* and all records processed because of that record complete processing.
* For asynchronous records completion means completion of the asyn phase.
*
* User code calls dbPutNotify and dbNotifyCancel.
*
* The other global routines (dbNotifyAdd and dbNotifyCompletion) are called by:
*
* dbAccess.c
* dbScanPassive and dbScanLink
* call dbNotifyAdd just before calling dbProcess
* dbProcess
* Calls dbNotifyCompletion if record is disabled.
* recGbl
* recGblFwdLink calls dbNotifyCompletion
*/
callbackGetUser(ppn,pcallback);
if(ppn->cmd==notifyCmdRepeat) {
status = dbPutNotify(ppn);
} else if(ppn->cmd==notifyCmdCallUser) {
ppn->cmd = notifyUserCalled;
(ppn->userCallback)(ppn);
} else {/*illegal request*/
recGblRecordError(-1,ppn->paddr->precord,
"dbNotifyCompletion: illegal callback request");
}
}
static void notifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
while(precord) {
void *pnext;
if(precord->rpro) {
precord->rpro = FALSE;
scanOnce(precord);
}
precord->ppn = NULL;
pnext = precord->ppnn;
precord->ppnn = NULL;
precord = pnext;
}
ppn->list = NULL;
}
void dbNotifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
if(!precord) return;
dbScanLock(precord);
notifyCancel(ppn);
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
/*Bad lets try one time to wait*/
dbScanUnlock(precord);
taskDelay(10);
dbScanLock(precord);
}
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
epicsPrintf("dbNotifyCancel called while callback requested"
" but not called\n");
}
dbScanUnlock(precord);
}
static void issueCallback(PUTNOTIFY *ppn, notifyCmd cmd)
{
if(ppn->cmd!=notifyCmdNull) return;
ppn->cmd = cmd;
notifyCancel(ppn);
callbackRequest(&ppn->callback);
}
/* Two fields in dbCommon are used for put notify.
* ppn
* If a record is part of a put notify group,
* This field is tha address of the associated PUTNOTIFY.
* As soon as a record completes processing the field is set NULL
* ppnn
* Address of an PNWAITNODE for keeping list of records in a
* put notify group. Once an PNWAITNODE is allocated for a record,
* it is never freed under the assumption that once a record
* becomes part of a put notify group it is likely to become
* one again in the future.
*/
static void restartAdd(PUTNOTIFY *ppnto, PUTNOTIFY *ppnfrom)
{
ppnfrom->restartNode.ppn = ppnfrom;
ppnfrom->restartNode.ppnrestartList = ppnto;
ppnfrom->restart = TRUE;
ellAdd(&ppnto->restartList,&ppnfrom->restartNode.node);
}
static void waitAdd(struct dbCommon *precord,PUTNOTIFY *ppn)
{
PNWAITNODE *ppnnode;
if(!precord->ppnn) precord->ppnn = dbCalloc(1,sizeof(PNWAITNODE));
ppnnode = (PNWAITNODE *)precord->ppnn;
ppnnode->precord = precord;
precord->ppn = ppn;
ellAdd(&ppn->waitList,&ppnnode->node);
}
long dbPutNotify(PUTNOTIFY *ppn)
{
long status;
struct dbCommon *precord = ppn->paddr->precord;
dbScanLock(precord);
ellInit(&ppn->restartList);
memset(&ppn->restartNode,'\0',sizeof(PNRESTARTNODE));
status = putNotify(ppn);
dbScanUnlock(precord);
return(status);
}
static long putNotify(PUTNOTIFY *ppn)
{
struct dbAddr *paddr = ppn->paddr;
short dbrType = ppn->dbrType;
void *pbuffer = ppn->pbuffer;
long nRequest = ppn->nRequest;
long status=0;
struct fldDes *pfldDes=(struct fldDes *)(paddr->pfldDes);
short dbrType = ppn->dbrType;
void *pbuffer = ppn->pbuffer;
long nRequest = ppn->nRequest;
long status=0;
dbFldDes *pfldDes=(dbFldDes *)(paddr->pfldDes);
struct dbCommon *precord = (struct dbCommon *)(paddr->precord);
if(precord->ppn == ppn) {
return(S_db_Blocked);
}
/*Initialize everything in PUTNOTIFY except restart list and node*/
callbackSetCallback(notifyCallback,&ppn->callback);
callbackSetUser(ppn,&ppn->callback);
callbackSetPriority(priorityLow,&ppn->callback);
ppn->status = 0;
ppn->restart = FALSE;
ppn->callbackState = callbackNotActive;
ellInit(&ppn->waitList);
/*check for putField disabled*/
if(precord->disp) {
if((void *)(&precord->disp) != paddr->pfield) {
ppn->status = S_db_putDisabled;
issueCallback(ppn,notifyCmdCallUser);
return(S_db_putDisabled);
issueCallback(ppn);
goto ret_pending;
}
}
ppn->status = 0;
ppn->cmd = notifyCmdNull;
ppn->nwaiting = 1;
ppn->rescan = FALSE;
dbScanLock(precord);
if(precord->ppn) {/*Another put notify is in progress*/
restartAdd(precord->ppn,ppn);
goto ret_pending;
}
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
precord->ppn = ppn;
waitAdd(precord,ppn);
restartAdd(precord->ppn,ppn);
goto ret_pending;
}
status=dbPut(paddr,dbrType,pbuffer,nRequest);
ppn->status = status;
if(status==0){
if((paddr->pfield==(void *)&precord->proc)
||(pfldDes->process_passive && precord->scan==0)) {
if(precord->ppn) {
/*record already has attached ppn. Blocked*/
ppn->status = status = S_db_Blocked;
dbScanUnlock(precord);
return(status);
}
precord->ppn = ppn;
precord->ppnn = NULL;
ppn->list = precord;
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
ppn->rescan = TRUE;
dbScanUnlock(precord);
return(S_db_Pending);
}
status=dbProcess(precord);
if(status!=0) {
ppn->status = status;
issueCallback(ppn,notifyCmdCallUser);
}
} else { /*Make callback immediately*/
issueCallback(ppn,notifyCmdCallUser);
}
if(status) {
ppn->status = status;
issueCallback(ppn);
goto ret_pending;
}
/*check for no processing required*/
if(!(paddr->pfield==(void *)&precord->proc)
&& (!pfldDes->process_passive || precord->scan!=0)) {
issueCallback(ppn);
goto ret_pending;
}
dbScanUnlock(precord);
/*Add record to waitlist*/
waitAdd(precord,ppn);
status=dbProcess(precord);
if(status!=0) {
ppn->status = status;
issueCallback(ppn);
}
ret_pending:
return(S_db_Pending);
}
void dbNotifyCompletion(PUTNOTIFY *ppn)
static void notifyCallback(CALLBACK *pcallback)
{
PUTNOTIFY *ppn=NULL;
struct dbCommon *precord;
if(ppn->status!=0) {
issueCallback(ppn,notifyCmdCallUser);
callbackGetUser(ppn,pcallback);
precord = ppn->paddr->precord;
dbScanLock(precord);
if(ppn->callbackState==callbackCanceled) {
dbScanUnlock(precord);
ppn->restart = FALSE;
ppn->callbackState = callbackNotActive;
semGive((SEM_ID)ppn->waitForCallback);
return;
}
/*decrement number of records being waited on*/
if(ppn->nwaiting<=0) {
recGblRecordError(-1,ppn->paddr->precord,"dbNotifyCompletion: nwaiting<-0 LOGIC");
return;
}
if(--ppn->nwaiting == 0) {/*original request completed*/
if(ppn->rescan) {
issueCallback(ppn,notifyCmdRepeat);
if(ppn->callbackState==callbackActive) {
if(ppn->restart) {
putNotify(ppn);
dbScanUnlock(precord);
} else {
issueCallback(ppn,notifyCmdCallUser);
dbScanUnlock(precord);
(ppn->userCallback)(ppn);
}
}
}
/*Remove all nonactive records from put notify list*/
void cleanPpList(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->list;
struct dbCommon *pnext;
struct dbCommon *pprev=NULL;
while(precord) {
pnext = precord->ppnn;
if(!precord->pact) {
if(!pprev) ppn->list = pnext; else pprev->ppnn = pnext;
precord->ppn = NULL;
precord->ppnn = NULL;
} else {
pprev = precord;
static void issueCallback(PUTNOTIFY *ppn)
{
notifyCancel(ppn);
ppn->callbackState = callbackActive;
callbackRequest(&ppn->callback);
}
void dbNotifyCancel(PUTNOTIFY *ppn)
{
struct dbCommon *precord = ppn->paddr->precord;;
dbScanLock(precord);
notifyCancel(ppn);
if(ppn->callbackState == callbackActive) {
ppn->waitForCallback = (void *)semBCreate(SEM_Q_FIFO,SEM_FULL);
ppn->callbackState = callbackCanceled;
dbScanUnlock(precord);
if(semTake((SEM_ID)ppn->waitForCallback,sysClkRateGet()*10)!=OK) {
errMessage(0,"dbNotifyCancel had semTake timeout");
ppn->callbackState = callbackNotActive;
}
precord = pnext;
semDelete((SEM_ID)ppn->waitForCallback);
} else {
dbScanUnlock(precord);
}
}
static void notifyCancel(PUTNOTIFY *ppn)
{
PNWAITNODE *ppnnode;
struct dbCommon *precord;
PNRESTARTNODE *pfirst;
/*Remove everything on waitList*/
while(ppnnode = (PNWAITNODE *)ellLast(&ppn->waitList)) {
precord = ppnnode->precord;
precord->ppn = NULL;
ellDelete(&ppn->waitList,&ppnnode->node);
}
/*If on restartList remove it*/
if(ppn->restartNode.ppnrestartList)
ellDelete(&ppn->restartNode.ppnrestartList->restartList,
&ppn->restartNode.node);
/*If this ppn has a restartList move it */
if(pfirst = (PNRESTARTNODE *)ellFirst(&ppn->restartList)) {
PNRESTARTNODE *pnext;
PUTNOTIFY *pfirstppn;
pfirstppn = pfirst->ppn;
ellConcat(&pfirstppn->restartList,&ppn->restartList);
pnext = (PNRESTARTNODE *)ellFirst(&pfirstppn->restartList);
while(pnext) {
pnext->ppnrestartList = pfirstppn;
pnext = (PNRESTARTNODE *)ellNext(&pnext->node);
}
pfirstppn->restart = TRUE;
pfirstppn->callbackState = callbackActive;
callbackRequest(&pfirstppn->callback);
}
memset(&ppn->restartNode,'\0',sizeof(PNRESTARTNODE));
}
void dbNotifyCompletion(struct dbCommon *precord)
{
PUTNOTIFY *ppn = (PUTNOTIFY *)precord->ppn;
PNWAITNODE *ppnnode = (PNWAITNODE *)precord->ppnn;;
ellDelete(&ppn->waitList,&ppnnode->node);
precord->ppn = NULL;
if((ppn->status!=0) || (ellCount(&ppn->waitList)==0))
issueCallback(ppn);
}
void dbNotifyAdd(struct dbCommon *pfrom, struct dbCommon *pto)
{
PUTNOTIFY *ppn = pfrom->ppn;
PUTNOTIFY *pfromppn = (PUTNOTIFY *)pfrom->ppn;
PUTNOTIFY *ppn=NULL;
if(pto->ppn) cleanPpList(pto->ppn); /* clean list before giving up*/
if(pto->ppn == pfrom->ppn) return; /*Aready in same set*/
if (pto->ppn) { /*already being used. Abandon request*/
ppn->status = S_db_Blocked;
dbNotifyCompletion(ppn);
notifyCancel(pfrom->ppn);
restartAdd(pto->ppn,pfromppn);
return;
} else {
ppn->nwaiting++;
pto->ppn = pfrom->ppn;
pto->ppnn = ppn->list;
ppn->list = pto;
/*If already active must redo*/
if(pto->pact) ppn->rescan = TRUE;
/*If already active must redo*/
if(pto->pact) {
ppn = pfrom->ppn;
notifyCancel(pfrom->ppn);
waitAdd(pto,ppn);
restartAdd(pto->ppn,ppn);
} else {
waitAdd(pto,pfrom->ppn);
}
}
}
static void dbtpnCallback(PUTNOTIFY *ppn)
{
DBADDR *pdbaddr = ppn->paddr;
long status = ppn->status;
if(status==S_db_Blocked)
printf("dbtpnCallback: blocked record=%s\n",ppn->paddr->precord->name);
else if(status==0)
printf("dbtpnCallback: success record=%s\n",ppn->paddr->precord->name);
else
recGblRecordError(status,pdbaddr->precord,"dbtpnCallback");
free((void *)pdbaddr);
free(ppn);
}
long dbtpn(char *pname,char *pvalue)
{
long status;
DBADDR *pdbaddr=NULL;
PUTNOTIFY *ppn=NULL;
char *psavevalue;
int len;
len = strlen(pvalue);
/*allocate space for value immediately following DBADDR*/
pdbaddr = dbCalloc(1,sizeof(DBADDR) + len+1);
psavevalue = (char *)(pdbaddr + 1);
strcpy(psavevalue,pvalue);
status = dbNameToAddr(pname,pdbaddr);
if(status) {
errMessage(status, "dbtpn: dbNameToAddr");
free((void *)pdbaddr);
return(-1);
}
ppn = dbCalloc(1,sizeof(PUTNOTIFY));
ppn->paddr = pdbaddr;
ppn->pbuffer = psavevalue;
ppn->nRequest = 1;
ppn->dbrType = DBR_STRING;
ppn->userCallback = dbtpnCallback;
status = dbPutNotify(ppn);
if(status==S_db_Pending) {
printf("dbtpn: Pending nwaiting=%d\n",ellCount(&ppn->waitList));
return(0);
}
if(status==S_db_Blocked) {
printf("dbtpn: blocked record=%s\n",pname);
} else if(status) {
errMessage(status, "dbtpn");
}
return(0);
}

View File

@@ -41,7 +41,7 @@
* .10 02-22-94 mrk Make init work if 1st record has 28 char name
* .11 05-04-94 mrk Call taskwdRemove only if spawing again
*/
#include <vxWorks.h>
#include <stdlib.h>
#include <stdio.h>
@@ -51,22 +51,25 @@
#include <ellLib.h>
#include <vxLib.h>
#include <tickLib.h>
#include <sysLib.h>
#include <dbDefs.h>
#include <epicsPrint.h>
#include <dbBase.h>
#include <dbStaticLib.h>
#include <dbAccess.h>
#include <dbScan.h>
#include <taskwd.h>
#include <callback.h>
#include <dbBase.h>
#include <dbCommon.h>
#include <dbRecords.h>
#include <devSup.h>
#include <recGbl.h>
#include <task_params.h>
#include <fast_lock.h>
#include <dbStaticLib.h>
extern struct dbBase *pdbBase;
extern volatile int interruptAccept;
extern struct dbBase *pdbbase;
/* SCAN ONCE */
#define ONCE_QUEUE_SIZE 256
@@ -146,7 +149,7 @@ long scanInit()
void post_event(int event)
{
unsigned char evnt;
int status;
static int newOverflow=TRUE;
if (!interruptAccept) return; /* not awake yet */
if(event<0 || event>=MAX_EVENTS) {
@@ -156,14 +159,14 @@ void post_event(int event)
evnt = (unsigned)event;
/*multiple writers can exist. Thus if evnt is ever changed to use*/
/*something bigger than a character interrupts will have to be blocked*/
if(rngBufPut(eventQ,(void *)&evnt,sizeof(unsigned char))!=sizeof(unsigned char))
errMessage(0,"rngBufPut overflow in post_event");
if((status=semGive(eventSem))!=OK){
/*semGive randomly returns garbage value*/
/*
errMessage(0,"semGive returned error in post_event");
*/
}
if(rngBufPut(eventQ,(void *)&evnt,sizeof(unsigned char))
!=sizeof(unsigned char)) {
if(newOverflow) errMessage(0,"rngBufPut overflow in post_event");
newOverflow = FALSE;
} else {
newOverflow = TRUE;
}
semGive(eventSem);
}
@@ -176,12 +179,14 @@ void scanAdd(struct dbCommon *precord)
scan = precord->scan;
if(scan==SCAN_PASSIVE) return;
if(scan<0 || scan>= nPeriodic+SCAN_1ST_PERIODIC) {
recGblRecordError(-1,(void *)precord,"scanAdd detected illegal SCAN value");
recGblRecordError(-1,(void *)precord,
"scanAdd detected illegal SCAN value");
}else if(scan==SCAN_EVENT) {
unsigned char evnt;
if(precord->evnt<0 || precord->evnt>=MAX_EVENTS) {
recGblRecordError(S_db_badField,(void *)precord,"scanAdd detected illegal EVNT value");
recGblRecordError(S_db_badField,(void *)precord,
"scanAdd detected illegal EVNT value");
precord->scan = SCAN_PASSIVE;
return;
}
@@ -200,13 +205,15 @@ void scanAdd(struct dbCommon *precord)
DEVSUPFUN get_ioint_info;
if(precord->dset==NULL){
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid (no DSET) ");
recGblRecordError(-1,(void *)precord,
"scanAdd: I/O Intr not valid (no DSET) ");
precord->scan = SCAN_PASSIVE;
return;
}
get_ioint_info=precord->dset->get_ioint_info;
if(get_ioint_info==NULL) {
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid (no get_ioint_info)");
recGblRecordError(-1,(void *)precord,
"scanAdd: I/O Intr not valid (no get_ioint_info)");
precord->scan = SCAN_PASSIVE;
return;
}
@@ -215,13 +222,15 @@ void scanAdd(struct dbCommon *precord)
return;
}
if(piosl==NULL) {
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid");
recGblRecordError(-1,(void *)precord,
"scanAdd: I/O Intr not valid");
precord->scan = SCAN_PASSIVE;
return;
}
priority = precord->prio;
if(priority<0 || priority>=NUM_CALLBACK_PRIORITIES) {
recGblRecordError(-1,(void *)precord,"scanAdd: illegal prio field");
recGblRecordError(-1,(void *)precord,
"scanAdd: illegal prio field");
precord->scan = SCAN_PASSIVE;
return;
}
@@ -246,18 +255,21 @@ void scanDelete(struct dbCommon *precord)
scan = precord->scan;
if(scan==SCAN_PASSIVE) return;
if(scan<0 || scan>= nPeriodic+SCAN_1ST_PERIODIC) {
recGblRecordError(-1,(void *)precord,"scanDelete detected illegal SCAN value");
recGblRecordError(-1,(void *)precord,
"scanDelete detected illegal SCAN value");
}else if(scan==SCAN_EVENT) {
unsigned char evnt;
if(precord->evnt<0 || precord->evnt>=MAX_EVENTS) {
recGblRecordError(S_db_badField,(void *)precord,"scanDelete detected illegal EVNT value");
recGblRecordError(S_db_badField,(void *)precord,
"scanDelete detected illegal EVNT value");
return;
}
evnt = (signed)precord->evnt;
psl = papEvent[evnt];
if(psl==NULL)
recGblRecordError(-1,(void *)precord,"scanDelete for bad evnt");
recGblRecordError(-1,(void *)precord,
"scanDelete for bad evnt");
else
deleteFromList(precord,psl);
} else if(scan==SCAN_IO_EVENT) {
@@ -266,22 +278,26 @@ void scanDelete(struct dbCommon *precord)
DEVSUPFUN get_ioint_info;
if(precord->dset==NULL) {
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid (no DSET)");
recGblRecordError(-1,(void *)precord,
"scanDelete: I/O Intr not valid (no DSET)");
return;
}
get_ioint_info=precord->dset->get_ioint_info;
if(get_ioint_info==NULL) {
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid (no get_ioint_info)");
recGblRecordError(-1,(void *)precord,
"scanDelete: I/O Intr not valid (no get_ioint_info)");
return;
}
if(get_ioint_info(1,precord,&piosl)) return;/*return if error*/
if(piosl==NULL) {
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid");
recGblRecordError(-1,(void *)precord,
"scanDelete: I/O Intr not valid");
return;
}
priority = precord->prio;
if(priority<0 || priority>=NUM_CALLBACK_PRIORITIES) {
recGblRecordError(-1,(void *)precord,"scanDelete: get_ioint_info returned illegal priority");
recGblRecordError(-1,(void *)precord,
"scanDelete: get_ioint_info returned illegal priority");
return;
}
piosl += priority; /*get piosl for correct priority*/
@@ -382,8 +398,14 @@ void scanIoRequest(IOSCANPVT pioscanpvt)
void scanOnce(void *precord)
{
if(rngBufPut(onceQ,(void *)&precord,sizeof(precord))!=sizeof(precord))
errMessage(0,"rngBufPut overflow in scanOnce");
static int newOverflow=TRUE;
if(rngBufPut(onceQ,(void *)&precord,sizeof(precord))!=sizeof(precord)) {
if(newOverflow)errMessage(0,"rngBufPut overflow in scanOnce");
newOverflow = FALSE;
}else {
newOverflow = TRUE;
}
semGive(onceSem);
}
@@ -438,54 +460,17 @@ static void periodicTask(struct scan_list *psl)
static void initPeriodic()
{
struct {
DBRenumStrs
} scanChoices;
struct scan_list *psl;
struct dbAddr dbAddr; /* database address */
struct recHeader *precHeader;
struct recLoc *precLoc;
RECNODE *precNode;
struct dbCommon *precord=NULL; /* pointer to record */
long status,nRequest,options;
void *pfl=NULL;
dbMenu *pmenu;
struct scan_list *psl;
float temp;
int i;
char name[PVNAME_SZ+FLDNAME_SZ+2];
float temp;
if(!(precHeader = pdbBase->precHeader)) {
errMessage(S_record_noRecords, "initPeriodic");
exit(1);
}
/* look for first record */
for (i=0; i<precHeader->number; i++) {
if((precLoc=precHeader->papRecLoc[i])==NULL) continue;
if(!precLoc->preclist) continue;
for(precNode=(RECNODE *)ellFirst(precLoc->preclist);
precNode; precNode = (RECNODE *)ellNext(&precNode->node)) {
precord = precNode->precord;
if(precord->name[0]!=0) goto got_record;
}
}
errMessage(S_record_noRecords,"initPeriodic");
return;
got_record:
/* get database address of SCAN field */
name[PVNAME_SZ] = 0;
strncpy(name,precord->name,PVNAME_SZ);
strcat(name,".SCAN");
if ((status=dbNameToAddr(name,&dbAddr)) != 0){
recGblDbaddrError(status,&dbAddr,"initPeriodic");
exit(1);
}
options = DBR_ENUM_STRS;
nRequest = 0;
status = dbGetField(&dbAddr,DBR_ENUM,&scanChoices,&options,&nRequest,pfl);
nPeriodic = scanChoices.no_str - SCAN_1ST_PERIODIC;
if(status || options!=DBR_ENUM_STRS || nPeriodic<=0) {
recGblDbaddrError(status,&dbAddr,"initPeriodic");
exit(1);
pmenu = dbFindMenu(pdbbase,"menuScan");
if(!pmenu) {
epicsPrintf("initPeriodic: menuScan not present\n");
return;
}
nPeriodic = pmenu->nChoice - SCAN_1ST_PERIODIC;
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list*));
periodicTaskId = dbCalloc(nPeriodic,sizeof(int));
for(i=0; i<nPeriodic; i++) {
@@ -493,7 +478,7 @@ got_record:
papPeriodic[i] = psl;
FASTLOCKINIT(&psl->lock);
ellInit(&psl->list);
sscanf(scanChoices.strs[i+SCAN_1ST_PERIODIC],"%f",&temp);
sscanf(pmenu->papChoiceValue[i+SCAN_1ST_PERIODIC],"%f",&temp);
psl->ticks = temp * vxTicksPerSecond;
}
}
@@ -598,7 +583,7 @@ static void printList(struct scan_list *psl,char *message)
struct scan_element *pse;
FASTLOCK(&psl->lock);
(void *)pse = ellFirst(&psl->list);
pse = (struct scan_element *)ellFirst(&psl->list);
FASTUNLOCK(&psl->lock);
if(pse==NULL) return;
printf("%s\n",message);
@@ -610,7 +595,7 @@ static void printList(struct scan_list *psl,char *message)
printf("Returning because list changed while processing.");
return;
}
(void *)pse = ellNext((void *)pse);
pse = (struct scan_element *)ellNext((void *)pse);
FASTUNLOCK(&psl->lock);
}
}
@@ -624,9 +609,9 @@ static void scanList(struct scan_list *psl)
FASTLOCK(&psl->lock);
psl->modified = FALSE;
(void *)pse = ellFirst(&psl->list);
pse = (struct scan_element *)ellFirst(&psl->list);
prev = NULL;
(void *)next = ellNext((void *)pse);
next = (struct scan_element *)ellNext((void *)pse);
FASTUNLOCK(&psl->lock);
while(pse!=NULL) {
struct dbCommon *precord = pse->precord;
@@ -637,27 +622,27 @@ static void scanList(struct scan_list *psl)
FASTLOCK(&psl->lock);
if(!psl->modified) {
prev = pse;
(void *)pse = ellNext((void *)pse);
if(pse!=NULL) (void *)next = ellNext((void *)pse);
pse = (struct scan_element *)ellNext((void *)pse);
if(pse!=NULL)next = (struct scan_element *)ellNext((void *)pse);
} else if (pse->pscan_list==psl) {
/*This scan element is still in same scan list*/
prev = pse;
(void *)pse = ellNext((void *)pse);
if(pse!=NULL) (void *)next = ellNext((void *)pse);
pse = (struct scan_element *)ellNext((void *)pse);
if(pse!=NULL)next = (struct scan_element *)ellNext((void *)pse);
psl->modified = FALSE;
} else if (prev!=NULL && prev->pscan_list==psl) {
/*Previous scan element is still in same scan list*/
(void *)pse = ellNext((void *)prev);
pse = (struct scan_element *)ellNext((void *)prev);
if(pse!=NULL) {
(void *)prev = ellPrevious((void *)pse);
(void *)next = ellNext((void *)pse);
prev = (struct scan_element *)ellPrevious((void *)pse);
next = (struct scan_element *)ellNext((void *)pse);
}
psl->modified = FALSE;
} else if (next!=NULL && next->pscan_list==psl) {
/*Next scan element is still in same scan list*/
pse = next;
(void *)prev = ellPrevious((void *)pse);
(void *)next = ellNext((void *)pse);
prev = (struct scan_element *)ellPrevious((void *)pse);
next = (struct scan_element *)ellNext((void *)pse);
psl->modified = FALSE;
} else {
/*Too many changes. Just wait till next period*/
@@ -670,27 +655,20 @@ static void scanList(struct scan_list *psl)
static void buildScanLists(void)
{
struct recHeader *precHeader;
struct recLoc *precLoc;
RECNODE *precNode;
struct dbCommon *precord; /* pointer to record */
int i;
dbRecDes *pdbRecDes;
dbRecordNode *pdbRecordNode;
dbCommon *precord;
if(!(precHeader = pdbBase->precHeader)) {
errMessage(S_record_noRecords,
"Error detected in build_scan_lists");
exit(1);
}
/* look through all of the database records and place them on lists */
for (i=0; i<precHeader->number; i++) {
if((precLoc=precHeader->papRecLoc[i])==NULL) continue;
if(!precLoc->preclist) continue;
for(precNode=(RECNODE *)ellFirst(precLoc->preclist);
precNode; precNode = (RECNODE *)ellNext(&precNode->node)) {
precord = precNode->precord;
if(precord->name[0]==0) continue;
scanAdd(precord);
}
/*Look for first record*/
for(pdbRecDes = (dbRecDes *)ellFirst(&pdbbase->recDesList); pdbRecDes;
pdbRecDes = (dbRecDes *)ellNext(&pdbRecDes->node)) {
for (pdbRecordNode=(dbRecordNode *)ellFirst(&pdbRecDes->recList);
pdbRecordNode;
pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) {
precord = pdbRecordNode->precord;
if(precord->name[0]==0) continue;
scanAdd(precord);
}
}
}
@@ -703,17 +681,17 @@ static void addToList(struct dbCommon *precord,struct scan_list *psl)
if(pse==NULL) {
pse = dbCalloc(1,sizeof(struct scan_element));
precord->spvt = (void *)pse;
(void *)pse->precord = precord;
pse->precord = precord;
}
pse ->pscan_list = psl;
(void *)ptemp = ellFirst(&psl->list);
ptemp = (struct scan_element *)ellFirst(&psl->list);
while(ptemp!=NULL) {
if(ptemp->precord->phas>precord->phas) {
ellInsert(&psl->list,
ellPrevious((void *)ptemp),(void *)pse);
break;
}
(void *)ptemp = ellNext((void *)ptemp);
ptemp = (struct scan_element *)ellNext((void *)ptemp);
}
if(ptemp==NULL) ellAdd(&psl->list,(void *)pse);
psl->modified = TRUE;

File diff suppressed because it is too large Load Diff

View File

@@ -129,6 +129,9 @@
#define MAX_STRING_SIZE 40
#endif
#ifndef MAX_UNITS_SIZE
#define MAX_UNITS_SIZE 8
#endif
/* VALUES WITH STATUS STRUCTURES */
@@ -269,7 +272,7 @@ struct dbr_time_double{
struct dbr_gr_int{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
short upper_disp_limit; /* upper limit of graph */
short lower_disp_limit; /* lower limit of graph */
short upper_alarm_limit;
@@ -281,7 +284,7 @@ struct dbr_gr_int{
struct dbr_gr_short{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
short upper_disp_limit; /* upper limit of graph */
short lower_disp_limit; /* lower limit of graph */
short upper_alarm_limit;
@@ -297,7 +300,7 @@ struct dbr_gr_float{
short severity; /* severity of alarm */
short precision; /* number of decimal places */
short RISC_pad0; /* RISC alignment */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
float upper_disp_limit; /* upper limit of graph */
float lower_disp_limit; /* lower limit of graph */
float upper_alarm_limit;
@@ -320,7 +323,7 @@ struct dbr_gr_enum{
struct dbr_gr_char{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
unsigned char upper_disp_limit; /* upper limit of graph */
unsigned char lower_disp_limit; /* lower limit of graph */
unsigned char upper_alarm_limit;
@@ -335,7 +338,7 @@ struct dbr_gr_char{
struct dbr_gr_long{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
long upper_disp_limit; /* upper limit of graph */
long lower_disp_limit; /* lower limit of graph */
long upper_alarm_limit;
@@ -351,7 +354,7 @@ struct dbr_gr_double{
short severity; /* severity of alarm */
short precision; /* number of decimal places */
short RISC_pad0; /* RISC alignment */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
double upper_disp_limit; /* upper limit of graph */
double lower_disp_limit; /* lower limit of graph */
double upper_alarm_limit;
@@ -370,7 +373,7 @@ struct dbr_gr_double{
struct dbr_ctrl_int{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
short upper_disp_limit; /* upper limit of graph */
short lower_disp_limit; /* lower limit of graph */
short upper_alarm_limit;
@@ -384,7 +387,7 @@ struct dbr_ctrl_int{
struct dbr_ctrl_short{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
short upper_disp_limit; /* upper limit of graph */
short lower_disp_limit; /* lower limit of graph */
short upper_alarm_limit;
@@ -402,7 +405,7 @@ struct dbr_ctrl_float{
short severity; /* severity of alarm */
short precision; /* number of decimal places */
short RISC_pad; /* RISC alignment */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
float upper_disp_limit; /* upper limit of graph */
float lower_disp_limit; /* lower limit of graph */
float upper_alarm_limit;
@@ -427,7 +430,7 @@ struct dbr_ctrl_enum{
struct dbr_ctrl_char{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
unsigned char upper_disp_limit; /* upper limit of graph */
unsigned char lower_disp_limit; /* lower limit of graph */
unsigned char upper_alarm_limit;
@@ -444,7 +447,7 @@ struct dbr_ctrl_char{
struct dbr_ctrl_long{
short status; /* status of value */
short severity; /* severity of alarm */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
long upper_disp_limit; /* upper limit of graph */
long lower_disp_limit; /* lower limit of graph */
long upper_alarm_limit;
@@ -462,7 +465,7 @@ struct dbr_ctrl_double{
short severity; /* severity of alarm */
short precision; /* number of decimal places */
short RISC_pad0; /* RISC alignment */
char units[8]; /* units of value */
char units[MAX_UNITS_SIZE]; /* units of value */
double upper_disp_limit; /* upper limit of graph */
double lower_disp_limit; /* lower limit of graph */
double upper_alarm_limit;
@@ -1017,7 +1020,8 @@ void *pfl;
pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1051,7 +1055,8 @@ void *pfl;
pold->status = new.status;
pold->severity = new.severity;
pold->precision = new.precision;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1083,7 +1088,8 @@ void *pfl;
pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1114,7 +1120,8 @@ void *pfl;
pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1148,7 +1155,8 @@ void *pfl;
pold->status = new.status;
pold->severity = new.severity;
pold->precision = new.precision;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1182,7 +1190,8 @@ void *pfl;
pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1219,7 +1228,8 @@ void *pfl;
pold->status = new.status;
pold->severity = new.severity;
pold->precision = new.precision;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1286,7 +1296,8 @@ void *pfl;
pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1320,7 +1331,8 @@ void *pfl;
status = dbGetField(paddr,DBR_LONG,&new,&options,&nRequest,pfl);
pold->status = new.status;
pold->severity = new.severity;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;
@@ -1357,7 +1369,8 @@ void *pfl;
pold->status = new.status;
pold->severity = new.severity;
pold->precision = new.precision;
strncpy(pold->units,new.units,8);
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
pold->units[MAX_UNITS_SIZE-1] = '\0';
pold->upper_disp_limit = new.upper_disp_limit;
pold->lower_disp_limit = new.lower_disp_limit;
pold->upper_alarm_limit = new.upper_alarm_limit;

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