Compare commits
211 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ed241a857 | ||
|
|
6e37e4a8b7 | ||
|
|
45910c7eae | ||
|
|
ab72202752 | ||
|
|
b728e45751 | ||
|
|
8b4249b582 | ||
|
|
bf260930ea | ||
|
|
e460c225da | ||
|
|
4a07ca3a11 | ||
|
|
2aeca30e8f | ||
|
|
6ad8e0f575 | ||
|
|
18822cda96 | ||
|
|
acaa1b6fbf | ||
|
|
38875dd8a7 | ||
|
|
af39a62adc | ||
|
|
fc981f3f7b | ||
|
|
f726540476 | ||
|
|
759d10c50e | ||
|
|
27d9d4d708 | ||
|
|
8643ae7413 | ||
|
|
f04b9fd8d3 | ||
|
|
574eb184cf | ||
|
|
ff33b704aa | ||
|
|
b23500efe6 | ||
|
|
14f0ea61dd | ||
|
|
6dc0835a7d | ||
|
|
ade952f351 | ||
|
|
dd34fb320b | ||
|
|
86e4be2f04 | ||
|
|
06626adbb8 | ||
|
|
5a32f7143d | ||
|
|
717ace8079 | ||
|
|
95294e2f3e | ||
|
|
341ec908c2 | ||
|
|
f91c3356ab | ||
|
|
6b6ef88793 | ||
|
|
adea6a0894 | ||
|
|
866e676a7a | ||
|
|
a8da2b9da4 | ||
|
|
ff6d6cb70a | ||
|
|
d205dc9b10 | ||
|
|
777e2d093d | ||
|
|
dbfab6b29e | ||
|
|
ecaaeb439a | ||
|
|
a635590f31 | ||
|
|
795b9645c9 | ||
|
|
fcf601fbf1 | ||
|
|
b95596f602 | ||
|
|
d0766a4f38 | ||
|
|
a650cd3ca2 | ||
|
|
96bd0f11c9 | ||
|
|
aaa2580224 | ||
|
|
84f32df855 | ||
|
|
79baa59608 | ||
|
|
853031bc90 | ||
|
|
c3734dcfee | ||
|
|
f2a8150e2d | ||
|
|
5b8ef5a985 | ||
|
|
3aff8d6754 | ||
|
|
c12944df48 | ||
|
|
a09ab523bb | ||
|
|
c02903d397 | ||
|
|
33608d5c23 | ||
|
|
293294cb48 | ||
|
|
03104dd373 | ||
|
|
6a922b6515 | ||
|
|
2be40c2ade | ||
|
|
2228ec3417 | ||
|
|
f8dd9b2bf7 | ||
|
|
4c5497c74e | ||
|
|
02feda47e1 | ||
|
|
cf209e1411 | ||
|
|
c00216a941 | ||
|
|
b3726f1cb4 | ||
|
|
c3ea9b769e | ||
|
|
4e1826d238 | ||
|
|
2792f1fc6b | ||
|
|
7a51dc30f2 | ||
|
|
01a4f1f64b | ||
|
|
144397decb | ||
|
|
edcd482415 | ||
|
|
2b7d67509e | ||
|
|
e113a5bed2 | ||
|
|
ebd6a8d8ca | ||
|
|
4407b2f24f | ||
|
|
0a9a3422b8 | ||
|
|
e96488dbb6 | ||
|
|
09b0f88c24 | ||
|
|
83ee1e7a8a | ||
|
|
df60df8a94 | ||
|
|
c3a7602526 | ||
|
|
5d91c2f5f3 | ||
|
|
3b6fc10bfe | ||
|
|
a043177422 | ||
|
|
f4a34606e1 | ||
|
|
3df522162b | ||
|
|
c0e611dcb8 | ||
|
|
1a133c65bb | ||
|
|
40237457e9 | ||
|
|
a9f37ef407 | ||
|
|
a2b2fe76fd | ||
|
|
75d1f5ef3e | ||
|
|
e25aa85707 | ||
|
|
93b26eee79 | ||
|
|
fb6f4ce704 | ||
|
|
8d8f5754a1 | ||
|
|
6c1d42f41d | ||
|
|
0bad952311 | ||
|
|
6128d3ac15 | ||
|
|
13c861d190 | ||
|
|
5aeafaf416 | ||
|
|
c3081b11d6 | ||
|
|
ef13c2bb75 | ||
|
|
b2ad0b6e1d | ||
|
|
636c7ba56c | ||
|
|
1f61d4acc2 | ||
|
|
6b0f997b20 | ||
|
|
0f0083ce46 | ||
|
|
25a6340993 | ||
|
|
a3652fd54e | ||
|
|
107ae2cee8 | ||
|
|
deb5e9c973 | ||
|
|
196f2302a4 | ||
|
|
2a21b01b0e | ||
|
|
56465da07f | ||
|
|
ee9457970a | ||
|
|
89a3746869 | ||
|
|
5be8f4999d | ||
|
|
b278c803ce | ||
|
|
50b8361078 | ||
|
|
2a121a4276 | ||
|
|
7b03ab0182 | ||
|
|
73a224a6ce | ||
|
|
f4af420e22 | ||
|
|
b0177729b8 | ||
|
|
c7b5592846 | ||
|
|
2f5202a4e4 | ||
|
|
ecb106fb71 | ||
|
|
b637c15e18 | ||
|
|
d1102b06c0 | ||
|
|
2fb23fd27b | ||
|
|
752b7e257e | ||
|
|
025b13b977 | ||
|
|
4c2822dd2e | ||
|
|
9dcee4c068 | ||
|
|
9bf802557e | ||
|
|
2566ee1e26 | ||
|
|
5a16ba053b | ||
|
|
ad3e5a3272 | ||
|
|
17511136a1 | ||
|
|
ffa22f89bd | ||
|
|
2e7075bd31 | ||
|
|
278eaf84d7 | ||
|
|
d957aebbf4 | ||
|
|
5ac2a99686 | ||
|
|
b782f63a7d | ||
|
|
e62f7d0ae2 | ||
|
|
1ca96e0116 | ||
|
|
44d65d9477 | ||
|
|
dc3ba94fc8 | ||
|
|
41ad7ae2ab | ||
|
|
017c55f9d9 | ||
|
|
196d7538c3 | ||
|
|
5ace66b609 | ||
|
|
0be218bed4 | ||
|
|
297f0b8c31 | ||
|
|
cc20412693 | ||
|
|
7021cd3589 | ||
|
|
b7acf453c2 | ||
|
|
c9abc2c82e | ||
|
|
a7484494c4 | ||
|
|
52cfbe92bf | ||
|
|
75f0fb2b0c | ||
|
|
ed36723d6c | ||
|
|
f7a5da9139 | ||
|
|
254c5b1620 | ||
|
|
c6aab85d79 | ||
|
|
d54724fce1 | ||
|
|
60c0acab3c | ||
|
|
69f33b9e23 | ||
|
|
9191863094 | ||
|
|
1beb157ab0 | ||
|
|
41ae285075 | ||
|
|
222063ac53 | ||
|
|
3342ca120f | ||
|
|
13b785e594 | ||
|
|
6931273fef | ||
|
|
8d52177933 | ||
|
|
b64fa8bd87 | ||
|
|
34ce2ab6ac | ||
|
|
43ef20b90c | ||
|
|
818bc0d475 | ||
|
|
ca2f9aff52 | ||
|
|
64a93df872 | ||
|
|
ecc03e9ad9 | ||
|
|
db1b46e5f9 | ||
|
|
d87295397e | ||
|
|
7277c336f7 | ||
|
|
30ad5b1149 | ||
|
|
c6bcd1a10b | ||
|
|
f3cf369071 | ||
|
|
adffe02a2d | ||
|
|
e635080cef | ||
|
|
be85da6a3a | ||
|
|
c16006f34d | ||
|
|
72491d8829 | ||
|
|
cb78c5adb8 | ||
|
|
1a2cd5953d | ||
|
|
5da79a5f56 | ||
|
|
9f2d9587f0 | ||
|
|
74e405969a |
45
COPYRIGHT_UniversityOfChicago
Normal file
45
COPYRIGHT_UniversityOfChicago
Normal 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).
|
||||
43
MakeRelease
43
MakeRelease
@@ -10,6 +10,19 @@
|
||||
# [-b] - For fully built release
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.4 1996/02/20 21:03:53 jba
|
||||
# Updated README files to reflect directory changes and new installEpics.
|
||||
#
|
||||
# Revision 1.3 1995/10/03 15:42:26 jba
|
||||
# Added *COPYRIGHT* files to release tar file.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
@@ -47,8 +60,8 @@
|
||||
|
||||
EPICS=${1};
|
||||
|
||||
if [ ! -d include -o ! -d src ]; then
|
||||
echo "Cannot find src or include, are you at the top of EPICS base ?"
|
||||
if [ ! -d src ]; then
|
||||
echo "Cannot find src directory, are you at the top of EPICS base ?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -60,8 +73,8 @@ if [ "${2}" = "-b" ]; then
|
||||
shift
|
||||
fi
|
||||
|
||||
# Retrieve EPICS release string from include/epicsVersion.h
|
||||
grep EPICS_VERSION_STRING include/epicsVersion.h > /dev/null 2>&1 || ERR=1;
|
||||
# Retrieve EPICS release string from src/include/epicsVersion.h
|
||||
grep EPICS_VERSION_STRING src/include/epicsVersion.h > /dev/null 2>&1 || ERR=1;
|
||||
|
||||
if [ "$ERR" = "1" ];
|
||||
then
|
||||
@@ -69,7 +82,7 @@ if [ "$ERR" = "1" ];
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
RELS=`grep "EPICS_VERSION_STRING" include/epicsVersion.h \
|
||||
RELS=`grep "EPICS_VERSION_STRING" src/include/epicsVersion.h \
|
||||
| sed -e 's-.*Version--' \
|
||||
-e 's-[ ][ ]*--g' \
|
||||
-e 's-".*--' \
|
||||
@@ -77,7 +90,7 @@ RELS=`grep "EPICS_VERSION_STRING" include/epicsVersion.h \
|
||||
|
||||
if [ -z "${RELS}" ];
|
||||
then
|
||||
echo "TOP: Cannot retrieve release number from include/epicsVersion.h";
|
||||
echo "TOP: Cannot retrieve release number from src/include/epicsVersion.h";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
@@ -88,7 +101,7 @@ 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.";
|
||||
echo "TOP: Remove Tar file or edit src/include/epicsVersion.h.";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
@@ -100,12 +113,26 @@ ls base/README* | xargs tar cvf ${RELS}.Tar
|
||||
|
||||
ls base/Makefile* > /tmp/make_release.out.$$;
|
||||
|
||||
find config base/include base/man base/tools -name CVS -prune -o \
|
||||
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 -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/include -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
|
||||
find base/man -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
|
||||
find base/bin -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
|
||||
|
||||
55
Makefile
55
Makefile
@@ -12,6 +12,16 @@
|
||||
# install because the release.% syntax is illegal.
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.26 1996/01/25 21:37:09 mrk
|
||||
# uninstall base/man
|
||||
#
|
||||
# Revision 1.25 1996/01/25 21:29:42 mrk
|
||||
# base/rec=>base/db base/include now installed
|
||||
#
|
||||
# Revision 1.24 1995/08/17 20:14:59 jba
|
||||
# Added base/tools scripts functionality to base/Makefile, removed scripts
|
||||
# Moved base/tools/MakeRelease to base dir.
|
||||
#
|
||||
# Revision 1.23 1995/02/13 15:00:09 jba
|
||||
# Changed include file from CONFIG_SITE to CONFIG
|
||||
#
|
||||
@@ -57,39 +67,29 @@ include $(EPICS)/config/CONFIG
|
||||
all: install
|
||||
|
||||
build:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
@(for ARCH in ${BUILD_ARCHS}; do \
|
||||
${MAKE} $@.$${ARCH}; \
|
||||
done)
|
||||
|
||||
install:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
@(for ARCH in ${BUILD_ARCHS}; do \
|
||||
${MAKE} $@.$${ARCH}; \
|
||||
done)
|
||||
|
||||
depends:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
@(for ARCH in ${BUILD_ARCHS}; do \
|
||||
${MAKE} $@.$${ARCH}; \
|
||||
done)
|
||||
|
||||
clean:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
@(for ARCH in ${BUILD_ARCHS}; do \
|
||||
${MAKE} $@.$${ARCH}; \
|
||||
done)
|
||||
|
||||
uninstall:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
@(for ARCH in ${BUILD_ARCHS}; do \
|
||||
${MAKE} $@.$${ARCH}; \
|
||||
done)
|
||||
|
||||
release:
|
||||
@echo TOP: Creating Release...
|
||||
@@ -138,9 +138,12 @@ release.%:
|
||||
|
||||
uninstall.%:
|
||||
@echo "TOP: Uninstalling $* "
|
||||
@rm -rf ./bin/$* ./lib/$* rec.bak rec
|
||||
@rm -rf ./bin/$* ./lib/$* db include man
|
||||
@rm -rf rec.bak rec
|
||||
|
||||
clean.%:
|
||||
@echo "TOP: Cleaning $* "
|
||||
@find src -type d -name "O.$*" -prune -exec rm -rf {} \;
|
||||
|
||||
|
||||
|
||||
|
||||
80
README
80
README
@@ -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.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
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
|
||||
remove files from ALL O.ARCH dirs, not
|
||||
gnumake - To build and install EPICS.
|
||||
gnumake clean - To clean temporary object files. Top level
|
||||
clean will remove all the 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. 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.
|
||||
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.
|
||||
2. EPICS binaries and shellscripts are installed into the bin/ARCH and
|
||||
lib/ARCH directories.
|
||||
|
||||
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
|
||||
@@ -109,7 +99,9 @@ CONFIG_SITE - This file is meant to be changed only by the EPICS system
|
||||
manager. It specifies:
|
||||
|
||||
HOST_ARCH: The system's host architecture (sun4/hp700/etc).
|
||||
BUILD_ARCHS: List of architectures to be built.
|
||||
This now come from an environment variable.
|
||||
CROSS_COMPILER_HOST_ARCHS: List of unix architectures with cross_compilers.
|
||||
CROSS_COMPILER_TARGET_ARCHS: List of architectures to build epics for.
|
||||
VX_DIR: Location of vxWorks.
|
||||
STATIC_BUILD: Whether or not to build clients statically.
|
||||
etc.
|
||||
|
||||
23
README.Linux
Normal file
23
README.Linux
Normal file
@@ -0,0 +1,23 @@
|
||||
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.
|
||||
|
||||
3) You MUST start caRepeater by hand before running a client.
|
||||
Prior to running a client, you must run:
|
||||
|
||||
caRepeater &
|
||||
|
||||
---
|
||||
jpq@nwu.edu
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,42 +4,9 @@
|
||||
# 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.
|
||||
|
||||
@@ -1,29 +1,20 @@
|
||||
----------------------------------------------------------------------------
|
||||
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.
|
||||
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
|
||||
|
||||
10
SkeletonCOPYRIGHT_UniversityOfChicago
Normal file
10
SkeletonCOPYRIGHT_UniversityOfChicago
Normal 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.
|
||||
**********************************************************************/
|
||||
@@ -11,8 +11,8 @@ DEPLIBS = ./libAs.a\
|
||||
$(DEPLIBS_BASE)/libCom.a\
|
||||
$(DEPLIBS_BASE)/libDb.a
|
||||
|
||||
LEX = $(ELEX)
|
||||
YACC = $(EYACC)
|
||||
INC += asDbLib.h
|
||||
INC += asLib.h
|
||||
|
||||
SRCS.c = ../ascheck.c asLib.c
|
||||
OBJS = ascheck.o
|
||||
|
||||
@@ -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);
|
||||
@@ -180,8 +184,9 @@ static long asInitCommon(void)
|
||||
int asInit(void)
|
||||
{
|
||||
|
||||
asInitCommon();
|
||||
return(0);
|
||||
/*If no access configuration file defined return success*/
|
||||
if(!pacf) return(0);
|
||||
return(asInitCommon());
|
||||
}
|
||||
|
||||
static void wdCallback(ASDBCALLBACK *pcallback)
|
||||
@@ -235,7 +240,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);
|
||||
@@ -245,12 +250,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;
|
||||
|
||||
@@ -261,7 +266,7 @@ long asSubInit(struct subRecord *precord,int pass)
|
||||
return(0);
|
||||
}
|
||||
|
||||
long asSubProcess(struct subRecord *precord)
|
||||
long asSubProcess(subRecord *precord)
|
||||
{
|
||||
ASDBCALLBACK *pcallback = (ASDBCALLBACK *)precord->dpvt;
|
||||
|
||||
@@ -278,8 +283,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);
|
||||
@@ -287,8 +292,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);
|
||||
@@ -303,13 +308,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) {
|
||||
@@ -331,7 +336,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);
|
||||
|
||||
78
src/as/asDbLib.h
Normal file
78
src/as/asDbLib.h
Normal file
@@ -0,0 +1,78 @@
|
||||
/* share/epicsH/dbAsLib.h */
|
||||
/* $Id$ */
|
||||
/* Author: Marty Kraimer Date: 02-23-94*/
|
||||
/*****************************************************************
|
||||
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).
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 02-23-94 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifndef INCdbAsLibh
|
||||
#define INCdbAsLibh
|
||||
#include <asLib.h>
|
||||
#include <callback.h>
|
||||
|
||||
typedef struct {
|
||||
CALLBACK callback;
|
||||
long status;
|
||||
} ASDBCALLBACK;
|
||||
|
||||
int asSetFilename(char *acf);
|
||||
int asInit(void);
|
||||
int asInitAsyn(ASDBCALLBACK *pcallback);
|
||||
int asDbGetAsl( void *paddr);
|
||||
ASMEMBERPVT asDbGetMemberPvt( void *paddr);
|
||||
int asdbdump( void);
|
||||
int aspuag(char *uagname);
|
||||
int asphag(char *hagname);
|
||||
int asprules(char *asgname);
|
||||
int aspmem(char *asgname,int clients);
|
||||
void asCaStart(void);
|
||||
void asCaStop(void);
|
||||
|
||||
#endif /*INCdbAsLibh*/
|
||||
223
src/as/asLib.h
Normal file
223
src/as/asLib.h
Normal file
@@ -0,0 +1,223 @@
|
||||
/* $Id$ */
|
||||
/* Author: Marty Kraimer Date: 09-27-93*/
|
||||
/*****************************************************************
|
||||
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).
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 09-27-93 mrk Initial Implementation
|
||||
*/
|
||||
#ifndef INCasLibh
|
||||
#define INCasLibh
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <errMdef.h>
|
||||
#include <ellLib.h>
|
||||
|
||||
typedef struct asgMember *ASMEMBERPVT;
|
||||
typedef struct asgClient *ASCLIENTPVT;
|
||||
typedef int (*ASINPUTFUNCPTR)(char *buf,int max_size);
|
||||
typedef enum{
|
||||
asClientCOAR /*Change of access rights*/
|
||||
/*For now this is all*/
|
||||
} asClientStatus;
|
||||
typedef void (*ASCLIENTCALLBACK) (ASCLIENTPVT,asClientStatus);
|
||||
/* The following routines are macros with the following syntax
|
||||
long asCheckGet(ASCLIENTPVT asClientPvt);
|
||||
long asCheckPut(ASCLIENTPVT asClientPvt);
|
||||
end of macros
|
||||
*/
|
||||
int asInit(void);
|
||||
long asInitialize(ASINPUTFUNCPTR inputfunction);
|
||||
/*caller must provide permanent storage for asgName*/
|
||||
long asAddMember(ASMEMBERPVT *asMemberPvt,char *asgName);
|
||||
long asRemoveMember(ASMEMBERPVT *asMemberPvt);
|
||||
/*caller must provide permanent storage for newAsgName*/
|
||||
long asChangeGroup(ASMEMBERPVT *asMemberPvt,char *newAsgName);
|
||||
void *asGetMemberPvt(ASMEMBERPVT asMemberPvt);
|
||||
void asPutMemberPvt(ASMEMBERPVT asMemberPvt,void *userPvt);
|
||||
/*client must provide permanent storage for user and host*/
|
||||
long asAddClient(ASCLIENTPVT *asClientPvt,ASMEMBERPVT asMemberPvt,
|
||||
int asl,char *user,char *host);
|
||||
/*client must provide permanent storage for user and host*/
|
||||
long asChangeClient(ASCLIENTPVT asClientPvt,int asl,char *user,char *host);
|
||||
long asRemoveClient(ASCLIENTPVT *asClientPvt);
|
||||
void *asGetClientPvt(ASCLIENTPVT asClientPvt);
|
||||
void asPutClientPvt(ASCLIENTPVT asClientPvt,void *userPvt);
|
||||
long asRegisterClientCallback(ASCLIENTPVT asClientPvt,
|
||||
ASCLIENTCALLBACK pcallback);
|
||||
long asComputeAllAsg(void);
|
||||
/*asComputeAsg is defined after ASG is defined*/
|
||||
long asCompute(ASCLIENTPVT asClientPvt);
|
||||
int asDump(void (*memcallback)(ASMEMBERPVT),void (*clientcallback)(ASCLIENTPVT),int verbose);
|
||||
int asDumpUag(char *uagname);
|
||||
int asDumpHag(char *hagname);
|
||||
int asDumpRules(char *asgname);
|
||||
int asDumpMem(char *asgname,void (*memcallback)(ASMEMBERPVT),int clients);
|
||||
int asDumpHash(void);
|
||||
|
||||
#define S_asLib_clientsExist (M_asLib| 1) /*Client Exists*/
|
||||
#define S_asLib_noUag (M_asLib| 2) /*User Access Group does not exist*/
|
||||
#define S_asLib_noHag (M_asLib| 3) /*Host Access Group does not exist*/
|
||||
#define S_asLib_noAccess (M_asLib| 4) /*access security: no access allowed*/
|
||||
#define S_asLib_noModify (M_asLib| 5) /*access security: no modification allowed*/
|
||||
#define S_asLib_badConfig (M_asLib| 6) /*access security: bad configuration file*/
|
||||
#define S_asLib_badCalc (M_asLib| 7) /*access security: bad calculation espression*/
|
||||
#define S_asLib_dupAsg (M_asLib| 8) /*Duplicate Access Security Group */
|
||||
#define S_asLib_InitFailed (M_asLib| 9) /*access security: Init failed*/
|
||||
#define S_asLib_asNotActive (M_asLib|10) /*access security is not active*/
|
||||
#define S_asLib_badMember (M_asLib|11) /*access security: bad ASMEMBERPVT*/
|
||||
#define S_asLib_badClient (M_asLib|12) /*access security: bad ASCLIENTPVT*/
|
||||
#define S_asLib_badAsg (M_asLib|13) /*access security: bad ASG*/
|
||||
#define S_asLib_noMemory (M_asLib|14) /*access security: no Memory */
|
||||
|
||||
/*Private declarations */
|
||||
#define ASMAXINP 12
|
||||
#ifdef vxWorks
|
||||
#include <fast_lock.h>
|
||||
extern FAST_LOCK asLock;
|
||||
extern int asLockInit;
|
||||
#endif
|
||||
extern int asActive;
|
||||
/* definition of access rights*/
|
||||
typedef enum{asNOACCESS,asREAD,asWRITE} asAccessRights;
|
||||
|
||||
/*Base pointers for access security*/
|
||||
typedef struct asBase{
|
||||
ELLLIST uagList;
|
||||
ELLLIST hagList;
|
||||
ELLLIST asgList;
|
||||
void *phash;
|
||||
} ASBASE;
|
||||
/*Defs for User Access Groups*/
|
||||
typedef struct{
|
||||
ELLNODE node;
|
||||
char *user;
|
||||
} UAGNAME;
|
||||
typedef struct uag{
|
||||
ELLNODE node;
|
||||
char *name;
|
||||
ELLLIST list; /*list of UAGNAME*/
|
||||
} UAG;
|
||||
/*Defs for Host Access Groups*/
|
||||
typedef struct{
|
||||
ELLNODE node;
|
||||
char *host;
|
||||
} HAGNAME;
|
||||
typedef struct hag{
|
||||
ELLNODE node;
|
||||
char *name;
|
||||
ELLLIST list; /*list of HAGNAME*/
|
||||
} HAG;
|
||||
/*Defs for Access SecurityGroups*/
|
||||
typedef struct {
|
||||
ELLNODE node;
|
||||
UAG *puag;
|
||||
}ASGUAG;
|
||||
typedef struct {
|
||||
ELLNODE node;
|
||||
HAG *phag;
|
||||
}ASGHAG;
|
||||
typedef struct{
|
||||
ELLNODE node;
|
||||
asAccessRights access;
|
||||
int level;
|
||||
int inpUsed; /*mask for which inputs are used*/
|
||||
int result; /*Result of calc converted to TRUE/FALSE*/
|
||||
char *calc;
|
||||
void *rpcl;
|
||||
ELLLIST uagList; /*List of ASGUAG*/
|
||||
ELLLIST hagList; /*List of ASGHAG*/
|
||||
} ASGRULE;
|
||||
typedef struct{
|
||||
ELLNODE node;
|
||||
char *inp;
|
||||
void *capvt;
|
||||
struct asg *pasg;
|
||||
int inpIndex;
|
||||
}ASGINP;
|
||||
typedef struct asg{
|
||||
ELLNODE node;
|
||||
char *name;
|
||||
ELLLIST inpList;
|
||||
ELLLIST ruleList;
|
||||
ELLLIST memberList;
|
||||
double *pavalue; /*pointer to array of input values*/
|
||||
int inpBad; /*mask for which inputs are bad*/
|
||||
int inpChanged; /*mask showing inputs that have changed*/
|
||||
} ASG;
|
||||
typedef struct asgMember {
|
||||
ELLNODE node;
|
||||
ASG *pasg;
|
||||
ELLLIST clientList;
|
||||
char *asgName;
|
||||
void *userPvt;
|
||||
} ASGMEMBER;
|
||||
typedef struct asgClient {
|
||||
ELLNODE node;
|
||||
ASGMEMBER *pasgMember;
|
||||
char *user;
|
||||
char *host;
|
||||
void *userPvt;
|
||||
ASCLIENTCALLBACK pcallback;
|
||||
int level;
|
||||
asAccessRights access;
|
||||
} ASGCLIENT;
|
||||
/* function prototypes*/
|
||||
void *asCalloc(size_t nobj,size_t size);
|
||||
long asComputeAsg(ASG *pasg);
|
||||
/*macros*/
|
||||
#define asCheckGet(asClientPvt)\
|
||||
(asActive ?\
|
||||
((asClientPvt)->access>=asREAD ? TRUE : FALSE)\
|
||||
: TRUE)
|
||||
#define asCheckPut(asClientPvt)\
|
||||
(asActive ?\
|
||||
((asClientPvt)->access>=asWRITE ? TRUE : FALSE)\
|
||||
: TRUE)
|
||||
|
||||
#endif /*INCasLibh*/
|
||||
@@ -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) {
|
||||
|
||||
@@ -2,6 +2,7 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
INC += bdt.h
|
||||
|
||||
LIBOBJS += bdt.o
|
||||
|
||||
|
||||
304
src/bdt/bdt.h
Normal file
304
src/bdt/bdt.h
Normal file
@@ -0,0 +1,304 @@
|
||||
#ifndef __BDT_H
|
||||
#define __BDT_H
|
||||
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.4 1995/07/27 14:21:58 winans
|
||||
* General mods for first release.
|
||||
*
|
||||
* Revision 1.3 1995/05/30 14:47:17 winans
|
||||
* Added BDT_Ping and a port parm to BdtIpOpen.
|
||||
*
|
||||
* Revision 1.2 1995/05/16 15:38:00 winans
|
||||
* Added BdtEof to BdtState enum list.
|
||||
* Added WriteLock and DeltaFlagLock to vxWorks-side BDTs.
|
||||
* Added port number args to BdtOpenListenerTCP() and BdtOpenListenerUDP().
|
||||
*
|
||||
* Revision 1.1 1995/05/11 02:08:44 jbk
|
||||
* new file for the bulk data transfer stuff
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
Author: Jim Kowalkowski
|
||||
Date: 5/1/95
|
||||
*/
|
||||
|
||||
/* got from protocols(5) (cheated) or /etc/protocols */
|
||||
#define BDT_UDP 17
|
||||
#define BDT_TCP 6
|
||||
|
||||
/* server ports - in the user reserved area */
|
||||
#define BDT_UDP_PORT 50296
|
||||
#define BDT_TCP_PORT 50297
|
||||
|
||||
/* Well known service names */
|
||||
#define BDT_SERVICE_PV "pv"
|
||||
#define BDT_SERVICE_NAME "name"
|
||||
#define BDT_SERVICE_DRV "drv"
|
||||
|
||||
#define PV_TRANSFER_SIZE 512
|
||||
|
||||
/* How often some type of message is expected to arrive at each end-point */
|
||||
#define BDT_PING_INTERVAL 10 /* Specified in seconds */
|
||||
#define BDT_CONENCTION_TIMEOUT 25 /* Specified in seconds */
|
||||
|
||||
/* message types */
|
||||
#define BDT_Ok 0
|
||||
#define BDT_Connect 1
|
||||
#define BDT_Error 2
|
||||
#define BDT_Get 3
|
||||
#define BDT_Put 4
|
||||
#define BDT_Close 5
|
||||
#define BDT_Monitor 6
|
||||
#define BDT_Value 7
|
||||
#define BDT_Delta 8
|
||||
#define BDT_Add 9
|
||||
#define BDT_Delete 10
|
||||
#define BDT_Ping 11
|
||||
|
||||
#define BDT_LAST_VERB 11
|
||||
|
||||
/* protocol states */
|
||||
typedef enum
|
||||
{ BdtIdle,BdtUnbound,BdtSData,BdtRData,BdtBad,BdtEof } BdtState;
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* The format of a BDT_Connect message is:
|
||||
*
|
||||
* BdtMsgHead.verb (unsigned 16 binary = BDT_Connect)
|
||||
* BdtMsgHead.size (unsigned 32 bit binary)
|
||||
* service name length (unsigned 8 bit binary)
|
||||
* service name string (service name length characters)
|
||||
* arg1 string length (unsigned 8 bit binary)
|
||||
* arg1 string (arg1 string length characters)
|
||||
* ...
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* NOTICE!!!!!!!! MONITORS ARE NOT CURRENTLY SUPPORTED!!!!!!!
|
||||
*
|
||||
* The BdtMonitor structure is created on the server-side when ever a client
|
||||
* registers a monitor. It contains a tag string that is given by the client
|
||||
* when the monitor is established. This tag string is an arbitrary binary
|
||||
* string of bytes... presumably used by the client as a pointer or index
|
||||
* to a status structure that represents the resource being monitored.
|
||||
*
|
||||
* The Message portion of the BdtMonitor represents the body of the message
|
||||
* that is to be sent to the client to indicate the status of the event that
|
||||
* happened. (It may not be present in the message.)
|
||||
*
|
||||
* The BdtMonitor structures are only hooked into the bdt.pMonitor list if they
|
||||
* are waiting to be sent to the client.
|
||||
*
|
||||
* The format of a BDT_Monitor message is:
|
||||
*
|
||||
* BdtMsgHead.verb (unsigned 16 binary = BDT_Monitor)
|
||||
* BdtMsgHead.size (unsigned 32 bit binary)
|
||||
* TagLength (unsigned 32 bit binary)
|
||||
* Tag (TagLength characters)
|
||||
* service name string (BdtMsgHead.size-TagLength-4 characters)
|
||||
*
|
||||
* The <service name string> for a monitor message should include the object
|
||||
* name(s) that are to be monitored.
|
||||
*
|
||||
*
|
||||
* The format of a BDT_Delta message is:
|
||||
*
|
||||
* BdtMsgHead.verb (unsigned 16 binary = BDT_Delta)
|
||||
* BdtMsgHead.size (unsigned 32 bit binary)
|
||||
* BdtMonitor.TagLength (unsigned 32 bit binary)
|
||||
* BdtMonitor.Tag (BdtMonitor.TagLength characters)
|
||||
* BdtMonitor.MessageLength (unsigned 32 bit binary)
|
||||
* BdtMonitor.Message (BdtMonitor.MessageLength characters)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct bdt;
|
||||
typedef struct BdtMonitor
|
||||
{
|
||||
struct bdt *pBdt; /* Connection to send notices back to */
|
||||
char *Tag; /* Client-generated tag */
|
||||
int TagLength; /* Length of tag */
|
||||
char *Message; /* Server-gen'd status change message */
|
||||
int MessageLength; /* Length of Message */
|
||||
struct BdtMonitor *pNext; /* Allow queue of N outbound on BDT */
|
||||
} BdtMonitor;
|
||||
|
||||
typedef int (*BdthandlerFunc)(struct bdt *Bdt);
|
||||
typedef struct BdtHandlers
|
||||
{
|
||||
BdthandlerFunc Ok;
|
||||
BdthandlerFunc Connect;
|
||||
BdthandlerFunc Error;
|
||||
BdthandlerFunc Get;
|
||||
BdthandlerFunc Put;
|
||||
BdthandlerFunc Close;
|
||||
BdthandlerFunc Monitor;
|
||||
BdthandlerFunc Value;
|
||||
BdthandlerFunc Delta;
|
||||
BdthandlerFunc Add;
|
||||
BdthandlerFunc Delete;
|
||||
BdthandlerFunc Ping;
|
||||
} BdtHandlers;
|
||||
|
||||
struct bdt
|
||||
{
|
||||
int soc;
|
||||
int remaining_send;
|
||||
int remaining_recv;
|
||||
BdtState state;
|
||||
|
||||
#ifdef vxWorks
|
||||
char *Name; /* Service name (used for messages) */
|
||||
SEM_ID WriteLock;
|
||||
SEM_ID MonitorLock;
|
||||
BdtMonitor *pMonitor; /* List of pending monitor events */
|
||||
BdthandlerFunc *pHandlers; /* Support routines for messages */
|
||||
void *pService; /* Provate pointer for service */
|
||||
#endif
|
||||
};
|
||||
typedef struct bdt BDT;
|
||||
|
||||
struct BdtMsgHead
|
||||
{
|
||||
unsigned short verb;
|
||||
unsigned long size;
|
||||
};
|
||||
typedef struct BdtMsgHead BdtMsgHead;
|
||||
|
||||
#define BdtGetSocket(BDT) (BDT->soc)
|
||||
#define BdtGetResidualWrite(BDT) (BDT->remaining_send)
|
||||
#define BdtGetResidualRead(BDT) (BDT->remaining_recv)
|
||||
#define BdtGetProtoState(BDT) (BDT->state)
|
||||
#ifdef vxWorks
|
||||
#define BdtGetServiceName(BDT) (BDT->Name)
|
||||
#endif
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
Server functions:
|
||||
|
||||
BdtOpenListenerTCP:
|
||||
Open a socket locally bound to the bulk data transfer TCP server port.
|
||||
Set the socket up as a listener. Return the open socket.
|
||||
|
||||
BdtOpenListenerUDP:
|
||||
Open a socket locally bound to the bulk data transfer UDP server port.
|
||||
Return the open socket.
|
||||
|
||||
------------------------------------------------------------------------ */
|
||||
|
||||
int BdtOpenListenerTCP(int Port);
|
||||
int BdtOpenListenerUDP(int Port);
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
Utilities functions:
|
||||
|
||||
BdtMakeServer:
|
||||
Available under unix only. Put process in the background, disassociate
|
||||
process from controlling terminal and parent process, and prepare
|
||||
signals for reaping children spawned by the process.
|
||||
|
||||
BdtServerClearSignals:
|
||||
Clear the signal handlers for a process, set them to default.
|
||||
|
||||
BdtMakeBDT:
|
||||
Allocate and initialize a BDT from a socket.
|
||||
|
||||
BdtFreeBDT:
|
||||
Close the open socket and free the memory for the BDT.
|
||||
------------------------------------------------------------------------ */
|
||||
|
||||
#ifndef vxWorks
|
||||
int BdtMakeServer(char** argv);
|
||||
int BdtServerClearSignals();
|
||||
#endif
|
||||
|
||||
BDT* BdtMakeBDT(int socket); /* make a BDT from a socket */
|
||||
int BdtFreeBDT(BDT* bdt); /* free a BDT */
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
Client functions:
|
||||
|
||||
BdtIpOpen:
|
||||
Open a connection to an bulk data transfer given the IP address of the
|
||||
machine where the server exists. The returned BDT is returned unbound,
|
||||
a connect must be issued before data transactions can take place.
|
||||
|
||||
BdtPvOpen:
|
||||
Open and connect (bind) to a process variable. Data transfers can
|
||||
take place after this call.
|
||||
|
||||
BdtServiceConnect:
|
||||
Used in conjunction with BdtIpOpen(). Bind an unbound BDT to a
|
||||
generic service provided by the server at the other end of the open
|
||||
connection.
|
||||
|
||||
BdtPvConnect:
|
||||
Used in conjunction with BdtIpOpen(). Bind an unbound BDT to a
|
||||
process variable on the server at the other end of the open
|
||||
connection.
|
||||
|
||||
BdtClose:
|
||||
Completely close a connection to a server and free the BDT.
|
||||
|
||||
BdtDeltaPending:
|
||||
Check if a delta message arrived at an unexpected time. This function
|
||||
clears the pending condition.
|
||||
|
||||
------------------------------------------------------------------------ */
|
||||
|
||||
BDT* BdtIpOpen(char* address, int port);
|
||||
BDT* BdtPvOpen(char *IocName, char* PvName);
|
||||
int BdtServiceConnect(BDT* bdt, char* service_name, char *args);
|
||||
int BdtPvConnect(BDT* bdt, char* pv_name);
|
||||
int BdtClose(BDT* bdt);
|
||||
int BdtPvDeltaPending(BDT* bdt);
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
Client and Server shared functions:
|
||||
|
||||
BdtSendHeader:
|
||||
Send a message header out to a connect BDT with command and message body
|
||||
size information.
|
||||
|
||||
BdtSendData:
|
||||
Send a portion or all the message body out a connected BDT. A header
|
||||
must have previously been sent with length information. The interface
|
||||
will only allow the amount of data specified in the header to be sent.
|
||||
|
||||
BdtWrite:
|
||||
This call will block until all the data specified in the size parameter
|
||||
are sent down the socket.
|
||||
|
||||
BdtRead:
|
||||
This call will block until all the data specified in the size parameter
|
||||
is read from the socket.
|
||||
|
||||
BdtReceiveHeader:
|
||||
Wait until a message header appears at the BDT, return the action and
|
||||
remaining message body size.
|
||||
|
||||
BdtReceiveData:
|
||||
Wait for a chunk or the entire body of a message to appear at the BDT.
|
||||
Put the data into the buffer for a maximum size. Return the amount of
|
||||
data actually received, or zero if there is no data remaining for the
|
||||
current message.
|
||||
|
||||
------------------------------------------------------------------------ */
|
||||
|
||||
int BdtSendHeader(BDT* bdt, unsigned short verb, int size);
|
||||
int BdtSendData(BDT* bdt, void* buffer, int size);
|
||||
int BdtReceiveHeader(BDT* bdt, int* verb, int* size);
|
||||
int BdtReceiveData(BDT* bdt, void* buffer, int size);
|
||||
int BdtRead(int socket, void* buffer, int size);
|
||||
int BdtWrite(int socket, void* buffer, int size);
|
||||
int BdtFlushOutput(BDT* bdt);
|
||||
int BdtPvPutArray(BDT *bdt, short DbrType, void *Buf, unsigned long NumElements, unsigned long ElementSize);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
18
src/bpt/Makefile
Normal file
18
src/bpt/Makefile
Normal 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
|
||||
|
||||
12
src/bpt/Makefile.Unix
Normal file
12
src/bpt/Makefile.Unix
Normal file
@@ -0,0 +1,12 @@
|
||||
EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
|
||||
INC += cvtTable.h
|
||||
|
||||
SRCS.c = ../makeBpt
|
||||
OBJS = makeBpt
|
||||
PROD = makeBpt
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
25
src/bpt/Makefile.Vx
Normal file
25
src/bpt/Makefile.Vx
Normal 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.db
|
||||
BPTS += bptTypeJdegF.db
|
||||
BPTS += bptTypeKdegC.db
|
||||
BPTS += bptTypeKdegF.db
|
||||
|
||||
|
||||
SRCS.c = \
|
||||
../cvtBpt.c
|
||||
|
||||
LIBOBJS = \
|
||||
cvtBpt.o
|
||||
|
||||
LIBNAME = pbtLib
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
142
src/bpt/bptTypeJdegC.data
Normal file
142
src/bpt/bptTypeJdegC.data
Normal 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
213
src/bpt/bptTypeJdegF.data
Normal 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
201
src/bpt/bptTypeKdegC.data
Normal 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
360
src/bpt/bptTypeKdegF.data
Normal 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
|
||||
@@ -1,9 +1,10 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* cvtBpt.c - Convert using breakpoint table */
|
||||
/*
|
||||
* Author: Janet Anderson
|
||||
* Date: 9-19-91
|
||||
/* cvtBpt.c - Convert using breakpoint table
|
||||
*
|
||||
* 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;
|
||||
45
src/bpt/cvtTable.h
Normal file
45
src/bpt/cvtTable.h
Normal file
@@ -0,0 +1,45 @@
|
||||
/* $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
|
||||
|
||||
/* Global Routines*/
|
||||
long cvtEngToRawBpt(double *pval,short linr,short init,
|
||||
void **ppbrk,short *plbrk);
|
||||
|
||||
long cvtRawToEngBpt(double *pval,short linr,short init,
|
||||
void **ppbrk, short *plbrk);
|
||||
|
||||
#endif
|
||||
405
src/bpt/makeBpt.c
Normal file
405
src/bpt/makeBpt.c
Normal 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,".db");
|
||||
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.db
Normal file
16
src/bpt/menuConvert.db
Normal 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")
|
||||
}
|
||||
@@ -23,7 +23,7 @@ $!
|
||||
$!========================================================================
|
||||
$!
|
||||
$! Example FTP script moves sources from UNIX to VMS
|
||||
$! (remove "$!" comment delimeters)
|
||||
$! (remove "$!" comment delimiters)
|
||||
$!
|
||||
$! user XXXXXXX
|
||||
$! cd [.ca]
|
||||
@@ -35,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
|
||||
$!========================================================================
|
||||
$!
|
||||
@@ -73,6 +75,7 @@ ENVSUBR, -
|
||||
TSSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
ASSERTUNIX, -
|
||||
ENVDATA, -
|
||||
CATIME, -
|
||||
ACCTST
|
||||
$ endif
|
||||
@@ -96,6 +99,7 @@ BUCKETLIB, -
|
||||
TSSUBR, -
|
||||
ENVSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
ENVDATA, -
|
||||
ASSERTUNIX, -
|
||||
ELLLIB
|
||||
$! Link the test programs
|
||||
|
||||
@@ -10,6 +10,12 @@ DEPLIBS = ./libca.a\
|
||||
$(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
|
||||
INC += cadef.h
|
||||
INC += caerr.h
|
||||
INC += caeventmask.h
|
||||
INC += calink.h
|
||||
INC += bsdProto.h
|
||||
|
||||
SRCS.c = \
|
||||
../iocinf.c ../access.c ../test_event.c ../service.c \
|
||||
../flow_control.c ../repeater.c ../conn.c \
|
||||
|
||||
166
src/ca/access.c
166
src/ca/access.c
@@ -1,3 +1,4 @@
|
||||
/* $Id$ */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
@@ -98,6 +99,29 @@
|
||||
/************************************************************************/
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.80 1995/10/18 16:49:23 jhill
|
||||
* recv task is now running at a lower priority than the send task under vxWorks
|
||||
*
|
||||
* 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 ***
|
||||
*
|
||||
@@ -309,6 +333,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
|
||||
@@ -328,21 +368,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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -565,6 +590,8 @@ int ca_os_independent_init (void)
|
||||
ca_spawn_repeater();
|
||||
}
|
||||
|
||||
ca_static->ca_flush_pending = FALSE;
|
||||
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
@@ -607,7 +634,7 @@ LOCAL void create_udp_fd()
|
||||
|
||||
status = taskSpawn(
|
||||
name,
|
||||
pri-1,
|
||||
pri+1,
|
||||
VX_FP_TASK,
|
||||
4096,
|
||||
(FUNCPTR)cac_recv_task,
|
||||
@@ -968,13 +995,14 @@ int epicsShareAPI 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;
|
||||
@@ -1963,7 +1991,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);
|
||||
@@ -2069,14 +2097,18 @@ long mask
|
||||
|
||||
/*
|
||||
* Check for huge waveform
|
||||
*
|
||||
* (the count is not checked here against the native count
|
||||
* when connected because this introduces a race condition
|
||||
* for the client tool - the requested count is clipped to
|
||||
* the actual count when the monitor request is sent so
|
||||
* verifying that the requested count is valid here isnt
|
||||
* required)
|
||||
*/
|
||||
if(dbr_size_n(type,count)>MAX_MSG_SIZE-sizeof(caHdr)){
|
||||
return ECA_TOLARGE;
|
||||
}
|
||||
|
||||
if(count > chix->count && chix->type != TYPENOTCONN)
|
||||
return ECA_BADCOUNT;
|
||||
|
||||
if(!mask)
|
||||
return ECA_BADMASK;
|
||||
|
||||
@@ -2522,6 +2554,8 @@ int epicsShareAPI 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;
|
||||
@@ -2668,18 +2702,16 @@ 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 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;
|
||||
@@ -2692,19 +2724,37 @@ int epicsShareAPI ca_pend (ca_real timeout, int early)
|
||||
* (guarantees that we wait for all send buffer to be
|
||||
* flushed even if this requires blocking)
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -2735,14 +2785,16 @@ int epicsShareAPI ca_pend (ca_real timeout, int early)
|
||||
if (remaining <= (1.0/USEC_PER_SEC)) {
|
||||
if(early){
|
||||
ca_pend_io_cleanup();
|
||||
ca_flush_io();
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
}
|
||||
/*
|
||||
* be certain that we processed
|
||||
* recv backlog at least once
|
||||
*/
|
||||
tmo.tv_sec = 0L;
|
||||
tmo.tv_usec = 0L;
|
||||
/*
|
||||
* force the flush
|
||||
*/
|
||||
LD_CA_TIME (0.0, &tmo);
|
||||
cac_block_for_io_completion (&tmo);
|
||||
return ECA_TIMEOUT;
|
||||
}
|
||||
@@ -2850,55 +2902,27 @@ LOCAL void ca_pend_io_cleanup()
|
||||
|
||||
/*
|
||||
* CA_FLUSH_IO()
|
||||
*
|
||||
* reprocess connection state and
|
||||
* flush the send buffer
|
||||
*
|
||||
*/
|
||||
int epicsShareAPI ca_flush_io()
|
||||
{
|
||||
struct ioc_in_use *piiu;
|
||||
struct timeval timeout;
|
||||
unsigned long bytesPending;
|
||||
|
||||
INITCHK;
|
||||
|
||||
while (TRUE) {
|
||||
int pending;
|
||||
/*
|
||||
* force early transmission of the first few search frames
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
|
||||
if (!pending) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* perform socket io
|
||||
* and process recv backlog
|
||||
*/
|
||||
LD_CA_TIME (SELECT_POLL, &timeout);
|
||||
cac_mux_io (&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;
|
||||
}
|
||||
|
||||
119
src/ca/acctst.c
119
src/ca/acctst.c
@@ -7,6 +7,18 @@ static char *sccsId = "@(#) $Id$";
|
||||
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.32 1995/11/29 19:17:25 jhill
|
||||
* more tests
|
||||
*
|
||||
* 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
|
||||
@@ -103,13 +115,13 @@ 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");
|
||||
|
||||
@@ -123,9 +135,9 @@ int doacctst(char *pname)
|
||||
{
|
||||
TS_STAMP end_time;
|
||||
TS_STAMP start_time;
|
||||
double delay;
|
||||
double request = 0.5;
|
||||
double accuracy;
|
||||
dbr_double_t delay;
|
||||
dbr_double_t request = 0.5;
|
||||
dbr_double_t accuracy;
|
||||
|
||||
tsLocalTime(&start_time);
|
||||
status = ca_pend_event(request);
|
||||
@@ -140,8 +152,8 @@ int doacctst(char *pname)
|
||||
assert (abs(accuracy) < 10.0);
|
||||
}
|
||||
|
||||
ptr = (struct dbr_gr_float *)
|
||||
malloc(dbr_size_n(DBR_GR_FLOAT, NUM));
|
||||
size = dbr_size_n(DBR_GR_FLOAT, NUM);
|
||||
ptr = (struct dbr_gr_float *) malloc(size);
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
|
||||
@@ -264,9 +276,9 @@ int doacctst(char *pname)
|
||||
ca_read_access(chix1) &&
|
||||
ca_write_access(chix1)){
|
||||
|
||||
double incr;
|
||||
double epsil;
|
||||
double base;
|
||||
dbr_double_t incr;
|
||||
dbr_double_t epsil;
|
||||
dbr_double_t base;
|
||||
unsigned long iter;
|
||||
|
||||
printf ("float test ...");
|
||||
@@ -328,7 +340,7 @@ int doacctst(char *pname)
|
||||
* solicitations
|
||||
*/
|
||||
if(ca_read_access(chix4)){
|
||||
float temp;
|
||||
dbr_float_t temp;
|
||||
|
||||
printf("Performing multiple get test...");
|
||||
fflush(stdout);
|
||||
@@ -349,7 +361,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);
|
||||
}
|
||||
@@ -396,7 +408,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,
|
||||
@@ -420,8 +432,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,
|
||||
@@ -499,8 +511,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))
|
||||
@@ -561,10 +573,39 @@ int doacctst(char *pname)
|
||||
conn_cb_count);
|
||||
}
|
||||
|
||||
printf("-- Put/Gets done- waiting for Events --\n");
|
||||
status = ca_pend_event(1000.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){
|
||||
@@ -580,9 +621,6 @@ int doacctst(char *pname)
|
||||
free(pgrfloat);
|
||||
}
|
||||
|
||||
status = ca_task_exit();
|
||||
SEVCHK(status,NULL);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -643,6 +681,19 @@ unsigned iterations)
|
||||
void null_event(struct event_handler_args args)
|
||||
{
|
||||
static int i;
|
||||
dbr_double_t fval = 3.8;
|
||||
int status;
|
||||
|
||||
#if 0
|
||||
if (ca_state(args.chid)==cs_conn) {
|
||||
status = ca_put(DBR_FLOAT, args.chid, &fval);
|
||||
SEVCHK(status, "put failed in null_event()");
|
||||
}
|
||||
else {
|
||||
printf("null_event() called for disconnected %s\n",
|
||||
ca_name(args.chid));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i++ > 1000) {
|
||||
printf("1000 occurred\n");
|
||||
@@ -654,9 +705,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,
|
||||
@@ -745,10 +802,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)){
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
#include <envDefs.h>
|
||||
|
||||
void caSetupAddrList(
|
||||
ELLLIST *pList,
|
||||
SOCKET socket);
|
||||
|
||||
void caPrintAddrList();
|
||||
void caPrintAddrList(ELLLIST *pList);
|
||||
|
||||
void caDiscoverInterfaces(
|
||||
ELLLIST *pList,
|
||||
@@ -19,17 +24,20 @@ 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;
|
||||
struct sockaddr sockAddr;
|
||||
};
|
||||
typedef union ca_addr {
|
||||
struct sockaddr_in in;
|
||||
struct sockaddr sa;
|
||||
}caAddr;
|
||||
|
||||
typedef struct {
|
||||
ELLNODE node;
|
||||
union caAddr srcAddr;
|
||||
union caAddr destAddr;
|
||||
ELLNODE node;
|
||||
caAddr srcAddr;
|
||||
caAddr destAddr;
|
||||
}caAddrNode;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
994
src/ca/cadef.h
Normal file
994
src/ca/cadef.h
Normal file
@@ -0,0 +1,994 @@
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
/* Los Alamos National Laboratory */
|
||||
/* Los Alamos, New Mexico 87545 */
|
||||
/* */
|
||||
/* Copyright, 1986, The Regents of the University of California. */
|
||||
/* Author Jeffrey O. Hill */
|
||||
/* hill@atdiv.lanl.gov */
|
||||
/* 505 665 1831 */
|
||||
/* */
|
||||
/* */
|
||||
/* History */
|
||||
/* ------- */
|
||||
/* */
|
||||
/* Date Person Comments */
|
||||
/* ---- ------ -------- */
|
||||
/* 08xx87 joh Init Release */
|
||||
/* 031290 joh Added db_access auto include */
|
||||
/* 031991 joh fixed SEVCHK dbl function call when status */
|
||||
/* returned indicates unsuccessful completion */
|
||||
/* 060591 joh delinting */
|
||||
/* 091691 joh exported channel state */
|
||||
/* 060392 joh added ca host name MACRO */
|
||||
/* 072792 joh added ca_test_io() decl */
|
||||
/* 072792 joh changed compile time flag from VAXC to STDC */
|
||||
/* so the function prototypes can be used by */
|
||||
/* other compilers */
|
||||
/* 072892 joh added function prototype for host name function */
|
||||
/* 101692 joh use unique name for var in SEVCHK to avoid */
|
||||
/* clashing with application */
|
||||
/* 120492 joh turn off VAXC ca_real reduction from double to */
|
||||
/* float. This was originally provided to ease */
|
||||
/* integration of the VAX FORTRAN based pt_shell */
|
||||
/* code which will in all likelyhood no longer */
|
||||
/* be used. */
|
||||
/* 120992 joh converted to dll list routines */
|
||||
/* 061193 joh added missing prototype for ca_clear_channel() */
|
||||
/* and others */
|
||||
/* 080593 rcz converted to ell list routines */
|
||||
/* 090893 joh added client id to channel in use block */
|
||||
/* 010694 joh added put callback rtn and synch group rtns */
|
||||
/* 090194 joh support C++ */
|
||||
/* 101194 joh merged NT changes */
|
||||
/* */
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* Title: GTA high level channel access routines C */
|
||||
/* function prototypes */
|
||||
/* File: cadef.h */
|
||||
/* Environment: Architecture independent */
|
||||
/* ( Current ports ) */
|
||||
/* VAXC, VMS V4.6 */
|
||||
/* SUNC, BSD UNIX V4.3 */
|
||||
/* SUNC, vxWorks */
|
||||
/* */
|
||||
/* */
|
||||
/* Purpose */
|
||||
/* ------- */
|
||||
/* */
|
||||
/* GTACS universal remote access library function prototypes. */
|
||||
/* ( C default argument passing mechanisms ) */
|
||||
/* */
|
||||
/* Special comments */
|
||||
/* ------- -------- */
|
||||
/* "ca_" is the standard prefix for the "channel access" library */
|
||||
/* function names. */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
/*_end */
|
||||
|
||||
#ifndef INCLcadefh
|
||||
#define INCLcadefh
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#define CAC_FUNC_PROTO
|
||||
#endif
|
||||
|
||||
#include <shareLib.h>
|
||||
|
||||
#ifdef __STDC__
|
||||
#define CAC_FUNC_PROTO
|
||||
#endif
|
||||
|
||||
#ifndef HDRVERSIONID
|
||||
# define HDRVERSIONID(NAME,VERS)
|
||||
#endif /*HDRVERSIONID*/
|
||||
|
||||
HDRVERSIONID(cadefh, "@(#) $Id$")
|
||||
|
||||
/* auto include of all stuff that cadef.h uses */
|
||||
#if defined(CAC_FUNC_PROTO) && !defined(CA_DONT_INCLUDE_STDARGH)
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#ifndef INCLdb_accessh
|
||||
#include <db_access.h>
|
||||
#endif /* INCLdb_accessh */
|
||||
|
||||
#ifndef INCLcaerrh
|
||||
#include <caerr.h>
|
||||
#endif /* INCLcaerrh */
|
||||
|
||||
#ifndef INCLcaeventmaskh
|
||||
#include <caeventmask.h>
|
||||
#endif /* INCLcaeventmaskh */
|
||||
|
||||
#ifndef INCLellLibh
|
||||
#include <ellLib.h>
|
||||
#endif /* INCLellLibh */
|
||||
|
||||
/*
|
||||
*
|
||||
* NOTE: the channel in use fields type, count, name, and
|
||||
* host name are available to applications. However it is
|
||||
* recommended that the following MACROS be used to access them.
|
||||
*
|
||||
*/
|
||||
#define ca_field_type(CHID) ((CHID)->type)
|
||||
#define ca_element_count(CHID) ((CHID)->count)
|
||||
#define ca_name(CHID) ((char *)((CHID)+1))
|
||||
#define ca_puser(CHID) ((CHID)->puser)
|
||||
#define ca_host_name(CHID) ca_host_name_function(CHID)
|
||||
#define ca_read_access(CHID) ((CHID)->ar.read_access)
|
||||
#define ca_write_access(CHID) ((CHID)->ar.write_access)
|
||||
|
||||
/*
|
||||
* cs_ - `channel state'
|
||||
*
|
||||
* cs_never_conn valid chid, IOC not found
|
||||
* cs_prev_conn valid chid, IOC was found, but unavailable
|
||||
* cs_conn valid chid, IOC was found, still available
|
||||
* cs_closed invalid chid
|
||||
*/
|
||||
enum channel_state{cs_never_conn, cs_prev_conn, cs_conn, cs_closed};
|
||||
#define ca_state(CHID) ((CHID)->state)
|
||||
|
||||
typedef struct ca_access_rights{
|
||||
unsigned read_access:1;
|
||||
unsigned write_access:1;
|
||||
}caar;
|
||||
|
||||
|
||||
/* Format for the arguments to user connection handlers */
|
||||
struct connection_handler_args{
|
||||
struct channel_in_use *chid; /* Channel id */
|
||||
long op; /* External codes for CA op */
|
||||
};
|
||||
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
typedef void caCh(struct connection_handler_args args);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
typedef void caCh();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
/* Format for the arguments to user access rights handlers */
|
||||
struct access_rights_handler_args{
|
||||
struct channel_in_use *chid; /* Channel id */
|
||||
caar ar; /* New access rights state */
|
||||
};
|
||||
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
typedef void caArh(struct access_rights_handler_args args);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
typedef void caArh();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
struct channel_in_use{
|
||||
ELLNODE node; /* list ptrs */
|
||||
short type; /* database field type */
|
||||
#define TYPENOTCONN (-1) /* the type when disconnected */
|
||||
unsigned short count; /* array element count */
|
||||
union{
|
||||
unsigned sid; /* server id */
|
||||
struct db_addr *paddr; /* database address */
|
||||
} id;
|
||||
void *puser; /* user available area */
|
||||
enum channel_state state; /* connected/ disconnected etc */
|
||||
caar ar; /* access rights */
|
||||
|
||||
/*
|
||||
* The following fields may change or even vanish in the future
|
||||
*/
|
||||
caCh *pConnFunc;
|
||||
caArh *pAccessRightsFunc;
|
||||
ELLLIST eventq;
|
||||
unsigned cid; /* client id */
|
||||
unsigned retry; /* search retry number */
|
||||
void *piiu; /* private ioc in use block */
|
||||
#ifdef vxWorks
|
||||
void *ppn; /* ptr to optional put notify blk */
|
||||
#endif /* vxWorks */
|
||||
/*
|
||||
* channel name stored directly after this structure in a
|
||||
* null terminated string.
|
||||
*/
|
||||
};
|
||||
|
||||
typedef struct channel_in_use *chid;
|
||||
typedef long chtype;
|
||||
typedef struct pending_event *evid;
|
||||
typedef double ca_real;
|
||||
|
||||
/* The conversion routine to call for each type */
|
||||
#define VALID_TYPE(TYPE) (((unsigned short)TYPE)<=LAST_BUFFER_TYPE)
|
||||
|
||||
|
||||
/* argument passed to event handlers and callback handlers */
|
||||
struct event_handler_args{
|
||||
void *usr; /* User argument supplied when event added */
|
||||
struct channel_in_use *chid; /* Channel id */
|
||||
long type; /* the type of the value returned */
|
||||
long count; /* the element count of the item returned */
|
||||
void *dbr; /* Pointer to the value returned */
|
||||
int status; /* CA Status of the op from server - CA V4.1 */
|
||||
};
|
||||
|
||||
struct pending_event{
|
||||
ELLNODE node; /* list ptrs */
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
void (*usr_func)(struct event_handler_args args);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
void (*usr_func)();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
void *usr_arg;
|
||||
struct channel_in_use *chan;
|
||||
chtype type; /* requested type for local CA */
|
||||
unsigned long count; /* requested count for local CA */
|
||||
/*
|
||||
* the following provide for reissuing a
|
||||
* disconnected monitor
|
||||
*/
|
||||
ca_real p_delta;
|
||||
ca_real n_delta;
|
||||
ca_real timeout;
|
||||
unsigned id;
|
||||
unsigned short mask;
|
||||
};
|
||||
|
||||
void epicsShareAPI ca_test_event
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
struct event_handler_args
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/* Format for the arguments to user exception handlers */
|
||||
struct exception_handler_args{
|
||||
void *usr; /* User argument supplied when event added */
|
||||
struct channel_in_use *chid; /* Channel id */
|
||||
long type; /* Requested type for the operation */
|
||||
long count; /* Requested count for the operation */
|
||||
void *addr; /* User's address to write results of CA_OP_GET */
|
||||
long stat; /* Channel access std status code */
|
||||
long op; /* External codes for channel access operations */
|
||||
char *ctx; /* A character string containing context info */
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* External OP codes for CA operations
|
||||
*
|
||||
*/
|
||||
#define CA_OP_GET 0
|
||||
#define CA_OP_PUT 1
|
||||
#define CA_OP_SEARCH 2
|
||||
#define CA_OP_ADD_EVENT 3
|
||||
#define CA_OP_CLEAR_EVENT 4
|
||||
#define CA_OP_OTHER 5
|
||||
#define CA_OP_CONN_UP 6
|
||||
#define CA_OP_CONN_DOWN 7
|
||||
|
||||
/************************************************************************/
|
||||
/* Perform Library Initialization */
|
||||
/* */
|
||||
/* Must be called once before calling any of the other routines */
|
||||
/************************************************************************/
|
||||
int epicsShareAPI ca_task_initialize
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
void
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/************************************************************************/
|
||||
/* Remove CA facility from your task */
|
||||
/* */
|
||||
/* Normally called automatically at task exit */
|
||||
/************************************************************************/
|
||||
int epicsShareAPI ca_task_exit
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
void
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Return a channel identification for the supplied channel name */
|
||||
/* (and attempt to create a virtual circuit) */
|
||||
/************************************************************************/
|
||||
|
||||
/*
|
||||
* preferred search mechanism
|
||||
*/
|
||||
#define ca_search(NAME,CHIDPTR)\
|
||||
ca_search_and_connect(NAME, CHIDPTR, 0, 0)
|
||||
/* ca_search
|
||||
(
|
||||
Name IO Value
|
||||
---- -- -----
|
||||
char *, NAME R NULL term ASCII channel name string
|
||||
chid * CHIDPTR RW channel index written here
|
||||
);
|
||||
*/
|
||||
|
||||
/************************************************************************
|
||||
* anachronistic entry points *
|
||||
* **** Fetching a value while searching nolonger supported**** *
|
||||
************************************************************************/
|
||||
#define ca_build_channel(NAME,XXXXX,CHIDPTR,YYYYY)\
|
||||
ca_build_and_connect(NAME, XXXXX, 1, CHIDPTR, YYYYY, 0, 0)
|
||||
|
||||
#define ca_array_build(NAME,XXXXX, ZZZZZZ, CHIDPTR,YYYYY)\
|
||||
ca_build_and_connect(NAME, XXXXX, ZZZZZZ, CHIDPTR, YYYYY, 0, 0)
|
||||
|
||||
|
||||
/*
|
||||
* preferred search mechanism
|
||||
*/
|
||||
int epicsShareAPI ca_search_and_connect
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
char *,/* NAME R NULL term ASCII channel name string */
|
||||
chid *,/* CHIDPTR RW channel index written here */
|
||||
void (*)(struct connection_handler_args),
|
||||
/* PFUNC R the address of user's connection handler*/
|
||||
void * /* PUSER R placed in the channel's puser field */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/************************************************************************
|
||||
* anachronistic entry point *
|
||||
* **** Fetching a value while searching nolonger supported**** *
|
||||
************************************************************************/
|
||||
int epicsShareAPI ca_build_and_connect
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
char *, /* NAME R NULL term ASCII channel name string */
|
||||
chtype, /* GET_TYPE R external channel type to get */
|
||||
unsigned/* (no get if invalid type) */
|
||||
long, /* GET_COUNT R array count to get */
|
||||
chid *, /* CHIDPTR RW channel index written here */
|
||||
void *, /* PVALUE W A pointer to a user supplied buffer */
|
||||
void (*)(struct connection_handler_args),
|
||||
/* PFUNC R the address of user's connection handler*/
|
||||
void * /* PUSER R placed in the channel's puser field */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
int epicsShareAPI ca_change_connection_event
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
chid chix,
|
||||
void (*pfunc)(struct connection_handler_args)
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
int epicsShareAPI ca_replace_access_rights_event(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
chid chix,
|
||||
void (*pfunc)(struct access_rights_handler_args)
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
*
|
||||
* replace the default exception handler
|
||||
*
|
||||
*/
|
||||
int epicsShareAPI ca_add_exception_event
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
void (*pfunc)(struct exception_handler_args),
|
||||
void *arg
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/************************************************************************/
|
||||
/* deallocate resources reserved for a channel */
|
||||
/************************************************************************/
|
||||
int epicsShareAPI ca_clear_channel
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chid /* CHAN, R channel identifier */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/************************************************************************/
|
||||
/* Write a value to a channel */
|
||||
/************************************************************************/
|
||||
#define ca_bput(CHID,PVALUE) ca_array_put(DBR_STRING, 1, CHID, (PVALUE))
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
char * PVALUE R pointer to a binary value string
|
||||
*/
|
||||
|
||||
#define ca_rput(CHID,PVALUE)\
|
||||
ca_array_put(DBR_FLOAT, 1, CHID, (PVALUE))
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
dbr_float_t * PVALUE R pointer to a real value
|
||||
*/
|
||||
|
||||
#define ca_put(CHTYPE, CHID, PVALUE) ca_array_put(CHTYPE, 1, CHID, PVALUE)
|
||||
/*
|
||||
Name IO Value
|
||||
---- -- -----
|
||||
chtype, TYPE R channel type
|
||||
chid, CHID R channel index
|
||||
void * PVALUE R pointer to new channel value of type specified
|
||||
i.e. status = ca_put(DBF_INT,chid,&value)
|
||||
*/
|
||||
|
||||
int epicsShareAPI ca_array_put
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void * /* PVALUE R pointer to new channel value of type */
|
||||
/* specified. */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* This routine functions identically to the original ca put request
|
||||
* with the addition of a callback to the user supplied function
|
||||
* after recod processing completes in the IOC. The arguments
|
||||
* to the user supplied callback function are declared in
|
||||
* the structure event_handler_args and include the pointer
|
||||
* sized user argument supplied when ca_array_get_callback() is called.
|
||||
*/
|
||||
int epicsShareAPI ca_array_put_callback
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void *, /* PVALUE R pointer to new channel value of type */
|
||||
void (*)(struct event_handler_args),
|
||||
/* USRFUNC R the address of a user supplied function */
|
||||
void * /* USRARG R An argument copied to the above function*/
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Read a value from a channel */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
#define ca_bget(CHID,PVALUE) ca_array_get(DBR_STRING, 1, CHID, PVALUE)
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
char * PVALUE W string value pointer
|
||||
*/
|
||||
|
||||
#define ca_rget(CHID,PVALUE) ca_array_get(DBR_FLOAT, 1, CHID, PVALUE)
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
dbr_float_t * PVALUE W real value pointer
|
||||
*/
|
||||
|
||||
#define ca_get(CHTYPE, CHID, PVALUE) ca_array_get(CHTYPE, 1, CHID, PVALUE)
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chtype, TYPE R channel type
|
||||
chid, CHID R channel index
|
||||
void * PVALUE W ptr to where channel value written
|
||||
*/
|
||||
|
||||
int epicsShareAPI ca_array_get
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void * /* PVALUE W ptr to where channel value written */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
/************************************************************************/
|
||||
/* Read a value from a channel and run a callback when the value */
|
||||
/* returns */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
#define ca_bget_callback(CHID,PFUNC,ARG)\
|
||||
ca_array_get_callback(DBR_STRING, 1, CHID, PFUNC, ARG)
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
void (*)(), PFUNC R the address of a user supplied function
|
||||
void *, ARG R An argument copied to the above function
|
||||
*/
|
||||
|
||||
#define ca_rget_callback(CHID,PFUNC,ARG)\
|
||||
ca_array_get_callback(DBR_FLOAT, 1, CHID, PFUNC, ARG)
|
||||
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chid CHID R channel id
|
||||
void (*)(), PFUNC R the address of a user supplied function
|
||||
void *, ARG R An argument copied to the above function
|
||||
*/
|
||||
|
||||
#define ca_get_callback(CHTYPE, CHID,PFUNC,ARG)\
|
||||
ca_array_get_callback(CHTYPE, 1, CHID, PFUNC, ARG)
|
||||
/*
|
||||
C Type Name IO Value
|
||||
------ ----- -- -----
|
||||
chtype, TYPE R channel type
|
||||
chid, CHID R channel index
|
||||
void (*)(), PFUNC R the address of a user supplied function
|
||||
void *, ARG R An argument copied to the above function
|
||||
*/
|
||||
|
||||
int epicsShareAPI ca_array_get_callback
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void (*)(struct event_handler_args),
|
||||
/* USRFUNC R the address of a user supplied function */
|
||||
void * /* USRARG R An argument copied to the above function */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Specify a function to be executed whenever significant changes */
|
||||
/* occur to a channel. */
|
||||
/* NOTES: */
|
||||
/* 1) Evid may be omited by passing a NULL pointer */
|
||||
/* */
|
||||
/* 2) AN array count of zero specifies the native db count */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
typedef struct event_handler_args evargs;
|
||||
|
||||
/* Assumes DELTA info comes from the database or defaults */
|
||||
#define ca_add_event(TYPE,CHID,ENTRY,ARG,EVID)\
|
||||
ca_add_array_event(TYPE,1,CHID,ENTRY,ARG,0.0,0.0,0.0,EVID)
|
||||
|
||||
/* Name IO Value
|
||||
---- -- -----
|
||||
chid, CHID R channel index
|
||||
void
|
||||
(*)(), USRFUNC R the address of a user supplied function
|
||||
void *, USRARG R An argument copied to the above function
|
||||
evid * EVIDPTR W An id to refer to this event by
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/* Sets both P_DELTA and M_DELTA below to argument DELTA */
|
||||
#define ca_add_delta_event(TYPE,CHID,ENTRY,ARG,DELTA,EVID)\
|
||||
ca_add_array_event(TYPE,1,CHID,ENTRY,ARG,DELTA,DELTA,0.0,EVID)
|
||||
/* Name IO Value
|
||||
---- -- -----
|
||||
chid, CHID R channel index
|
||||
void
|
||||
(*)(), USRFUNC R the address of a user supplied function
|
||||
void *, USRARG R An argument copied to the above function
|
||||
ca_real, DELTA R Generate events after +-delta excursions
|
||||
evid * EVIDPTR W An id to refer to this event by
|
||||
*/
|
||||
|
||||
|
||||
#define ca_add_general_event(TYPE,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)\
|
||||
ca_add_array_event(TYPE,1,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)
|
||||
|
||||
#define ca_add_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)\
|
||||
ca_add_masked_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID, DBE_VALUE | DBE_ALARM)
|
||||
|
||||
|
||||
|
||||
int epicsShareAPI ca_add_masked_array_event
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chtype, /* TYPE R requested external channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void (*)(struct event_handler_args),
|
||||
/* USRFUNC R the address of a user supplied function */
|
||||
void *, /* USRARG R An argument copied to the above function*/
|
||||
ca_real,/* P_DELTA R Generate events after +delta excursions */
|
||||
ca_real,/* N_DELTA R Generate events after -delta excursions */
|
||||
ca_real,/* TIMEOUT R Generate events after timeout sec */
|
||||
evid *, /* EVIDPTR W An id to refer to this event by */
|
||||
long /* MASK R event trigger type */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Remove a function from a list of those specified to run */
|
||||
/* whenever significant changes occur to a channel */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
int epicsShareAPI ca_clear_event
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
evid /* EVID R Event id returned by add event */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* Requested data is not necessarily stable prior to */
|
||||
/* return from called subroutine. Call ca_pend_io() */
|
||||
/* to guarantee that requested data is stable. Call the routine */
|
||||
/* ca_flush_io() to force all outstanding subroutine calls to be */
|
||||
/* sent out over the network. Significant increases in */
|
||||
/* performance have been measured when batching several remote */
|
||||
/* subroutine calls together into one message. Additional */
|
||||
/* improvements can be obtained by performing local processing */
|
||||
/* in parallel with outstanding remote processing. */
|
||||
/* */
|
||||
/* FLOW OF TYPICAL APPLICATION */
|
||||
/* */
|
||||
/* search() ! Obtain Channel ids */
|
||||
/* . ! " */
|
||||
/* */
|
||||
/* get() ! several requests for remote info */
|
||||
/* get() ! " */
|
||||
/* add_event() ! " */
|
||||
/* get() ! " */
|
||||
/* . */
|
||||
/* . */
|
||||
/* . */
|
||||
/* flush_io() ! send get requests */
|
||||
/* ! optional parallel processing */
|
||||
/* . ! " */
|
||||
/* . ! " */
|
||||
/* pend_io() ! wait for replies from get requests */
|
||||
/* . ! access to requested data */
|
||||
/* . ! " */
|
||||
/* pend_event() ! wait for requested events */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/************************************************************************/
|
||||
/* This routine pends waiting for channel events and calls the */
|
||||
/* functions specified with add_event when events occur. If the */
|
||||
/* timeout is specified as 0 an infinite timeout is assumed. */
|
||||
/* if the argument early is specified TRUE then CA_NORMAL is */
|
||||
/* returned when outstanding queries complete. Otherwise if the */
|
||||
/* argument early is FALSE the routine does not return until the */
|
||||
/* entire delay specified by the timeout argument has expired. */
|
||||
/* ca_flush_io() is called by this routine. If the argument */
|
||||
/* early is TRUE then ca_pend() will return immediately without */
|
||||
/* processing outstanding CA labor if no queries are outstanding */
|
||||
/************************************************************************/
|
||||
#define ca_pend_event(TIMEOUT) ca_pend((TIMEOUT), 0/*FALSE*/)
|
||||
#define ca_pend_io(TIMEOUT) ca_pend((TIMEOUT), 1/*TRUE*/)
|
||||
|
||||
int epicsShareAPI ca_pend
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
ca_real,/* TIMEOUT R timeout in seconds */
|
||||
int /* EARLY R return early if IO completes */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* returns TRUE when queries are outstanding
|
||||
*/
|
||||
int epicsShareAPI ca_test_io
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
void
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/************************************************************************/
|
||||
/* Send out all outstanding messages in the send queue */
|
||||
/************************************************************************/
|
||||
int epicsShareAPI ca_flush_io
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
void
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
void epicsShareAPI ca_signal
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
long, /* CODE R status returned from channel access function */
|
||||
char * /* MSG R null term string printed on error */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
void epicsShareAPI ca_signal_with_file_and_lineno
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
long, /* CODE R status returned from channel access function */
|
||||
char *, /* MSG R null term string printed on error */
|
||||
char *, /* FILE R pointer to null terminated file name string */
|
||||
int /* LINENO R line number */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* Provided for efficient test and display of channel access errors
|
||||
*/
|
||||
#define SEVCHK(CA_ERROR_CODE, MESSAGE_STRING) \
|
||||
{ \
|
||||
int ca_unique_status_name = (CA_ERROR_CODE); \
|
||||
if(!(ca_unique_status_name & CA_M_SUCCESS)) \
|
||||
ca_signal_with_file_and_lineno( \
|
||||
ca_unique_status_name, \
|
||||
(MESSAGE_STRING), \
|
||||
__FILE__, \
|
||||
__LINE__); \
|
||||
}
|
||||
|
||||
char * epicsShareAPI ca_host_name_function
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
chid /* CHID R Channel ID */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* CA_ADD_FD_REGISTRATION
|
||||
*
|
||||
* call their function with their argument whenever
|
||||
* a new fd is added or removed
|
||||
* (for use with a manager of the select system call under UNIX)
|
||||
*
|
||||
*/
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
typedef void CAFDHANDLER(void *parg, int fd, int opened);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
typedef void CAFDHANDLER();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
int epicsShareAPI ca_add_fd_registration(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CAFDHANDLER *pHandler,
|
||||
void *pArg
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
#ifdef vxWorks
|
||||
int epicsShareAPI ca_channel_status(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int tid
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
#endif
|
||||
|
||||
#ifdef vxWorks
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int ca_import(int tid);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int ca_import();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
#endif /* vxWorks */
|
||||
|
||||
#ifdef vxWorks
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int ca_import_cancel(int tid);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int ca_import_cancel();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
#endif /* vxWorks */
|
||||
|
||||
/*
|
||||
* CA synch groups
|
||||
*
|
||||
* This facility will allow the programmer to create
|
||||
* any number of synchronization groups. The programmer might then
|
||||
* interleave IO requests within any of the groups. Once The
|
||||
* IO operations are initiated then the programmer is free to
|
||||
* block for IO completion within any one of the groups as needed.
|
||||
*/
|
||||
typedef unsigned WRITEABLE_CA_SYNC_GID;
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
typedef const unsigned CA_SYNC_GID;
|
||||
#else
|
||||
typedef unsigned CA_SYNC_GID;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* create a sync group
|
||||
*/
|
||||
int epicsShareAPI ca_sg_create(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CA_SYNC_GID *pgid
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* delete a sync group
|
||||
*/
|
||||
int epicsShareAPI ca_sg_delete(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CA_SYNC_GID gid
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* block for IO performed within a sync group to complete
|
||||
*/
|
||||
int epicsShareAPI ca_sg_block(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CA_SYNC_GID gid,
|
||||
ca_real timeout
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* test for sync group IO operations in progress
|
||||
*/
|
||||
int epicsShareAPI ca_sg_test(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CA_SYNC_GID gid
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* ca_sg_reset
|
||||
*/
|
||||
int epicsShareAPI ca_sg_reset(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
CA_SYNC_GID gid
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* initiate a get within a sync group
|
||||
* (essentially a ca_array_get() with a sync group specified)
|
||||
*/
|
||||
int epicsShareAPI ca_sg_array_get
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
CA_SYNC_GID,/* GID R synch group id */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void * /* PVALUE W ptr to where channel value written */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* initiate a put within a sync group
|
||||
* (essentially a ca_array_put() with a sync group specified)
|
||||
*/
|
||||
int epicsShareAPI ca_sg_array_put
|
||||
(
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
/* Name IO Value */
|
||||
/* ---- -- ----- */
|
||||
CA_SYNC_GID,/* GID R synch group id */
|
||||
chtype, /* TYPE R channel type */
|
||||
unsigned long,
|
||||
/* COUNT R array element count */
|
||||
chid, /* CHID R channel index */
|
||||
void * /* PVALUE R pointer to new channel value of type */
|
||||
/* specified. */
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
);
|
||||
|
||||
/*
|
||||
* CA_MODIFY_USER_NAME()
|
||||
*
|
||||
* Modify or override the default
|
||||
* client user name.
|
||||
*/
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int epicsShareAPI ca_modify_user_name(char *pUserName);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int epicsShareAPI ca_modify_user_name();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
/*
|
||||
* CA_MODIFY_HOST_NAME()
|
||||
*
|
||||
* Modify or override the default
|
||||
* client host name.
|
||||
*/
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int epicsShareAPI ca_modify_host_name(char *pHostName);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int epicsShareAPI ca_modify_host_name();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
/*
|
||||
* Put call back is available if the CA server is on version is 4.2
|
||||
* or higher.
|
||||
*
|
||||
* (return true or false)
|
||||
*/
|
||||
#ifdef CAC_FUNC_PROTO
|
||||
int epicsShareAPI ca_v42_ok(chid chan);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int epicsShareAPI ca_v42_ok();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
/*
|
||||
* ca_replace_printf_handler ()
|
||||
*
|
||||
* for apps that want to change where ca formatted
|
||||
* text output goes
|
||||
*/
|
||||
#if defined(CAC_FUNC_PROTO) && !defined(CA_DONT_INCLUDE_STDARGH)
|
||||
int epicsShareAPI ca_replace_printf_handler (
|
||||
int (*ca_printf_func)(const char *pformat, va_list args)
|
||||
);
|
||||
#else /*CAC_FUNC_PROTO*/
|
||||
int epicsShareAPI ca_replace_printf_handler ();
|
||||
#endif /*CAC_FUNC_PROTO*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* no additions below this endif
|
||||
*/
|
||||
#endif /* INCLcadefh */
|
||||
216
src/ca/caerr.h
Normal file
216
src/ca/caerr.h
Normal file
@@ -0,0 +1,216 @@
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
/* Los Alamos National Laboratory */
|
||||
/* Los Alamos, New Mexico 87545 */
|
||||
/* */
|
||||
/* Copyright, 1986, The Regents of the University of California. */
|
||||
/* */
|
||||
/* Author: Jeffrey O. Hill */
|
||||
/* */
|
||||
/* History */
|
||||
/* ------- */
|
||||
/* */
|
||||
/* Date Programmer Comments */
|
||||
/* ---- ---------- -------- */
|
||||
/* 08--87 joh Init Release */
|
||||
/* 031290 joh Changed __CAERR__ to INCLcaerrh */
|
||||
/* 102990 joh added readonly for VAXC share image */
|
||||
/* 032092 joh added ECA_BADMASK */
|
||||
/* 072792 joh added ECA_IODONE & ECA_IOINPROGESS */
|
||||
/* 102992 joh changed wording on the no vx fp message */
|
||||
/* 011494 joh Added ECA_BADSYNCGRP */
|
||||
/* 021194 joh Added ECA_PUTCBINPROG */
|
||||
/* */
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* Name: */
|
||||
/* Title: */
|
||||
/* File: */
|
||||
/* Environment: VMS, UNIX, VRTX */
|
||||
/* Equipment: VAX, SUN, VME */
|
||||
/* */
|
||||
/* */
|
||||
/* Purpose */
|
||||
/* ------- */
|
||||
/* */
|
||||
/* CA error message declaration include file */
|
||||
/* */
|
||||
/* */
|
||||
/* Special comments */
|
||||
/* ------- -------- */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
/*_end */
|
||||
|
||||
#ifndef INCLcaerrh
|
||||
#define INCLcaerrh
|
||||
|
||||
#include <shareLib.h>
|
||||
|
||||
#ifndef HDRVERSIONID
|
||||
# define HDRVERSIONID(NAME,VERS)
|
||||
#endif /*HDRVERSIONID*/
|
||||
|
||||
HDRVERSIONID(caerrh, "@(#) $Id$")
|
||||
|
||||
/* CA Status Code Definitions */
|
||||
|
||||
#define CA_K_INFO 3 /* successful */
|
||||
#define CA_K_ERROR 2 /* failed- continue */
|
||||
#define CA_K_SUCCESS 1 /* successful */
|
||||
#define CA_K_WARNING 0 /* unsuccessful */
|
||||
#define CA_K_SEVERE 4 /* failed- quit */
|
||||
#define CA_K_FATAL CA_K_ERROR | CA_K_SEVERE
|
||||
|
||||
#define CA_M_MSG_NO 0x0000FFF8
|
||||
#define CA_M_SEVERITY 0x00000007
|
||||
#define CA_M_LEVEL 0x00000003
|
||||
#define CA_M_SUCCESS 0x00000001
|
||||
#define CA_M_ERROR 0x00000002
|
||||
#define CA_M_SEVERE 0x00000004
|
||||
|
||||
#define CA_S_MSG_NO 0x0D
|
||||
#define CA_S_SEVERITY 0x03
|
||||
|
||||
#define CA_V_MSG_NO 0x03
|
||||
#define CA_V_SEVERITY 0x00
|
||||
#define CA_V_SUCCESS 0x00
|
||||
|
||||
/* Define MACROS to extract/insert individual fields from a status value */
|
||||
|
||||
#define CA_EXTRACT_MSG_NO(code)\
|
||||
( ( (code) & CA_M_MSG_NO ) >> CA_V_MSG_NO )
|
||||
#define CA_EXTRACT_SEVERITY(code)\
|
||||
( ( (code) & CA_M_SEVERITY ) >> CA_V_SEVERITY )
|
||||
#define CA_EXTRACT_SUCCESS(code)\
|
||||
( ( (code) & CA_M_SUCCESS ) >> CA_V_SUCCESS )
|
||||
|
||||
#define CA_INSERT_MSG_NO(code)\
|
||||
( ((code)<< CA_V_MSG_NO) & CA_M_MSG_NO )
|
||||
#define CA_INSERT_SEVERITY(code)\
|
||||
( ((code)<< CA_V_SEVERITY)& CA_M_SEVERITY )
|
||||
#define CA_INSERT_SUCCESS(code)\
|
||||
( ((code)<< CA_V_SUCCESS) & CA_M_SUCCESS )
|
||||
|
||||
|
||||
#define DEFMSG(SEVERITY,NUMBER)\
|
||||
(CA_INSERT_MSG_NO(NUMBER) | CA_INSERT_SEVERITY(SEVERITY))
|
||||
|
||||
|
||||
#define ECA_NORMAL DEFMSG(CA_K_SUCCESS, 0)
|
||||
#define ECA_MAXIOC DEFMSG(CA_K_ERROR, 1)
|
||||
#define ECA_UKNHOST DEFMSG(CA_K_ERROR, 2)
|
||||
#define ECA_UKNSERV DEFMSG(CA_K_ERROR, 3)
|
||||
#define ECA_SOCK DEFMSG(CA_K_ERROR, 4)
|
||||
#define ECA_CONN DEFMSG(CA_K_WARNING, 5)
|
||||
#define ECA_ALLOCMEM DEFMSG(CA_K_WARNING, 6)
|
||||
#define ECA_UKNCHAN DEFMSG(CA_K_WARNING, 7)
|
||||
#define ECA_UKNFIELD DEFMSG(CA_K_WARNING, 8)
|
||||
#define ECA_TOLARGE DEFMSG(CA_K_ERROR, 9)
|
||||
#define ECA_TIMEOUT DEFMSG(CA_K_WARNING, 10)
|
||||
#define ECA_NOSUPPORT DEFMSG(CA_K_WARNING, 11)
|
||||
#define ECA_STRTOBIG DEFMSG(CA_K_WARNING, 12)
|
||||
#define ECA_BADCHID DEFMSG(CA_K_ERROR, 13)
|
||||
#define ECA_BADTYPE DEFMSG(CA_K_ERROR, 14)
|
||||
#define ECA_CHIDNOTFND DEFMSG(CA_K_INFO, 15)
|
||||
#define ECA_CHIDRETRY DEFMSG(CA_K_INFO, 16)
|
||||
#define ECA_INTERNAL DEFMSG(CA_K_FATAL, 17)
|
||||
#define ECA_DBLCLFAIL DEFMSG(CA_K_WARNING, 18)
|
||||
#define ECA_GETFAIL DEFMSG(CA_K_WARNING, 19)
|
||||
#define ECA_PUTFAIL DEFMSG(CA_K_WARNING, 20)
|
||||
#define ECA_ADDFAIL DEFMSG(CA_K_WARNING, 21)
|
||||
#define ECA_BADCOUNT DEFMSG(CA_K_WARNING, 22)
|
||||
#define ECA_BADSTR DEFMSG(CA_K_ERROR, 23)
|
||||
#define ECA_DISCONN DEFMSG(CA_K_INFO, 24)
|
||||
#define ECA_DBLCHNL DEFMSG(CA_K_INFO, 25)
|
||||
#define ECA_EVDISALLOW DEFMSG(CA_K_ERROR, 26)
|
||||
#define ECA_BUILDGET DEFMSG(CA_K_WARNING, 27)
|
||||
#define ECA_NEEDSFP DEFMSG(CA_K_INFO, 28)
|
||||
#define ECA_OVEVFAIL DEFMSG(CA_K_WARNING, 29)
|
||||
#define ECA_BADMONID DEFMSG(CA_K_ERROR, 30)
|
||||
#define ECA_NEWADDR DEFMSG(CA_K_INFO, 31)
|
||||
#define ECA_NEWCONN DEFMSG(CA_K_INFO, 32)
|
||||
#define ECA_NOCACTX DEFMSG(CA_K_WARNING, 33)
|
||||
#define ECA_DEFUNCT DEFMSG(CA_K_FATAL, 34)
|
||||
#define ECA_EMPTYSTR DEFMSG(CA_K_WARNING, 35)
|
||||
#define ECA_NOREPEATER DEFMSG(CA_K_INFO, 36)
|
||||
#define ECA_NOCHANMSG DEFMSG(CA_K_INFO, 37)
|
||||
#define ECA_DLCKREST DEFMSG(CA_K_INFO, 38)
|
||||
#define ECA_SERVBEHIND DEFMSG(CA_K_INFO, 39)
|
||||
#define ECA_NOCAST DEFMSG(CA_K_WARNING, 40)
|
||||
#define ECA_BADMASK DEFMSG(CA_K_ERROR, 41)
|
||||
#define ECA_IODONE DEFMSG(CA_K_INFO, 42)
|
||||
#define ECA_IOINPROGRESS DEFMSG(CA_K_INFO, 43)
|
||||
#define ECA_BADSYNCGRP DEFMSG(CA_K_ERROR, 44)
|
||||
#define ECA_PUTCBINPROG DEFMSG(CA_K_ERROR, 45)
|
||||
#define ECA_NORDACCESS DEFMSG(CA_K_WARNING, 46)
|
||||
#define ECA_NOWTACCESS DEFMSG(CA_K_WARNING, 47)
|
||||
#define ECA_ANACHRONISM DEFMSG(CA_K_ERROR, 48)
|
||||
#define ECA_NOSEARCHADDR DEFMSG(CA_K_WARNING, 49)
|
||||
|
||||
|
||||
#ifndef CA_ERROR_GLBLSOURCE
|
||||
epicsShareExtern char *ca_message_text[];
|
||||
#else
|
||||
char *ca_message_text[]
|
||||
=
|
||||
{
|
||||
"Normal successful completion",
|
||||
"Maximum simultaneous IOC connections exceeded",
|
||||
"Unknown internet host",
|
||||
"Unknown internet service",
|
||||
"Unable to allocate a new socket",
|
||||
"Unable to connect to internet host or service",
|
||||
"Unable to allocate additional dynamic memory",
|
||||
"Unknown IO channel",
|
||||
"Record field specified inappropriate for channel specified",
|
||||
"The array or data structure specified will not fit in CA message buffer",
|
||||
"User specified timeout on IO operation expired",
|
||||
"Sorry, that feature is planned but not supported at this time",
|
||||
"The supplied string is unusually large",
|
||||
"The request was ignored because the specified channel is disconnected",
|
||||
"The type you have requested from this channel is unknown",
|
||||
"Remote Channel not found",
|
||||
"Unable to locate all user specified channels",
|
||||
"Channel Access Internal Failure",
|
||||
"The requested local DB operation failed",
|
||||
"Could not perform a database value get for that channel",
|
||||
"Could not perform a database value put for that channel",
|
||||
"Could not perform a database event add for that channel",
|
||||
"Count requested inappropriate for that channel",
|
||||
"The supplied string has improper format",
|
||||
"Network connection lost",
|
||||
"Ambiguous channel host (multiple IOC's have a channel by that name)",
|
||||
"The CA routine called is inappropriate for use within an event handler",
|
||||
"Database value get for that channel failed during channel search",
|
||||
"Unable to initialize without the vxWorks VX_FP_TASK task option set",
|
||||
"Event queue overflow has prevented first pass event after event add",
|
||||
"A monitor by that id cant be found",
|
||||
"Remote channel has new network address",
|
||||
"New or resumed network connection",
|
||||
"Attempt to import from a task without a CA context failed",
|
||||
"Attempt to use defunct CA feature failed",
|
||||
"The supplied string is empty",
|
||||
"Unable to spawn the CA repeater thread- auto reconnect will fail",
|
||||
"No channel id match for search reply- search reply ignored",
|
||||
"Reseting dead connection- will try to reconnect",
|
||||
"Server (IOC) has fallen behind or is not responding- still waiting",
|
||||
"No internet interface with broadcast available",
|
||||
"The event selection mask supplied is empty or inappropriate",
|
||||
"IO operations have completed",
|
||||
"IO operations are in progress",
|
||||
"Invalid synchronous group identifier",
|
||||
"Put call back operation collision with put call back operation in progress",
|
||||
"Read access denied",
|
||||
"Write access denied",
|
||||
"Sorry, that anachronistic feature of CA is no longer supported",
|
||||
"The search request/beacon address list was empty after initialization"
|
||||
};
|
||||
#endif
|
||||
|
||||
#define ca_message(STATUS)\
|
||||
(ca_message_text[CA_EXTRACT_MSG_NO((STATUS))])
|
||||
|
||||
#endif
|
||||
36
src/ca/caeventmask.h
Normal file
36
src/ca/caeventmask.h
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
$Id$
|
||||
caeventmask.h
|
||||
|
||||
Modification History
|
||||
joh 04-16-90 Created
|
||||
|
||||
*/
|
||||
|
||||
#ifndef INCLcaeventmaskh
|
||||
#define INCLcaeventmaskh
|
||||
|
||||
/*
|
||||
event selections
|
||||
(If any more than 8 of these are needed then update the
|
||||
select field in the event_block struct in db_event.c from
|
||||
unsigned char to unsigned short)
|
||||
|
||||
|
||||
DBE_VALUE
|
||||
Trigger an event when a significant change in the channel's value
|
||||
occurs. Relies on the monitor deadband field under DCT.
|
||||
|
||||
DBE_LOG
|
||||
Trigger an event when an archive significant change in the channel's
|
||||
valuue occurs. Relies on the archiver monitor deadband field under DCT.
|
||||
|
||||
DBE_ALARM
|
||||
Trigger an event when the alarm state changes
|
||||
|
||||
*/
|
||||
#define DBE_VALUE (1<<0)
|
||||
#define DBE_LOG (1<<1)
|
||||
#define DBE_ALARM (1<<2)
|
||||
|
||||
#endif
|
||||
25
src/ca/calink.h
Normal file
25
src/ca/calink.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
#ifndef INCcalinkh
|
||||
#define INCcalinkh
|
||||
|
||||
#ifndef INCerrMdefh
|
||||
#include <errMdef.h>
|
||||
#endif
|
||||
#define S_dbCa_nullarg (M_dbCa | 1) /*dbCa_nullarg*/
|
||||
#define S_dbCa_failedmalloc (M_dbCa | 3) /*dbCa_failedmalloc*/
|
||||
#define S_dbCa_foundnull (M_dbCa | 5) /*dbCa_foundnull*/
|
||||
#define S_dbCa_ECA_EVDISALLOW (M_dbCa | 7) /*dbCa_ECA_EVDISALLOW*/
|
||||
#define S_dbCa_ECA_BADCHID (M_dbCa | 9) /*dbCa_ECA_BADCHID*/
|
||||
#define S_dbCa_ECA_BADTYPE (M_dbCa | 11) /*dbCa_ECA_BADTYPE*/
|
||||
#define S_dbCa_ECA_ALLOCMEM (M_dbCa | 13) /*dbCa_ECA_ALLOCMEM*/
|
||||
#define S_dbCa_ECA_ADDFAIL (M_dbCa | 15) /*dbCa_ECA_ADDFAIL*/
|
||||
#define S_dbCa_ECA_STRTOBIG (M_dbCa | 17) /*dbCa_ECA_STRTOBIG*/
|
||||
#define S_dbCa_ECA_GETFAIL (M_dbCa | 19) /*dbCa_ECA_GETFAIL*/
|
||||
#define S_dbCa_ECA_BADCOUNT (M_dbCa | 21) /*dbCa_ECA_BADCOUNT*/
|
||||
#define S_dbCa_ECA_PUTFAIL (M_dbCa | 23) /*dbCa_ECA_PUTFAIL*/
|
||||
#define S_dbCa_unknownECA (M_dbCa | 25) /*dbCa_unknownECA*/
|
||||
#define S_dbCa_dbfailure (M_dbCa | 27) /*dbCa_dbfailure*/
|
||||
#define S_dbCa_cafailure (M_dbCa | 29) /*dbCa_cafailure*/
|
||||
#endif /* INCcalinkh */
|
||||
@@ -141,7 +141,7 @@ int catime (char *channelName)
|
||||
itemList[i].val.intval = 0;
|
||||
itemList[i].type = DBR_INT;
|
||||
}
|
||||
printf ("interger test\n");
|
||||
printf ("integer test\n");
|
||||
test (itemList, NELEMENTS(itemList));
|
||||
|
||||
printf ("free test\n");
|
||||
|
||||
@@ -51,7 +51,6 @@ void flow_control(struct ioc_in_use *piiu)
|
||||
{
|
||||
unsigned nbytes;
|
||||
int status;
|
||||
int busy = piiu->client_busy;
|
||||
|
||||
LOCK;
|
||||
|
||||
@@ -74,19 +73,19 @@ void flow_control(struct ioc_in_use *piiu)
|
||||
*/
|
||||
if (nbytes) {
|
||||
piiu->contiguous_msg_count++;
|
||||
if (!busy)
|
||||
if (!piiu->client_busy)
|
||||
if (piiu->contiguous_msg_count >
|
||||
MAX_CONTIGUOUS_MSG_COUNT) {
|
||||
piiu->client_busy = TRUE;
|
||||
ca_busy_message(piiu);
|
||||
# ifdef DEBUG
|
||||
# if defined(DEBUG)
|
||||
printf("fc on\n");
|
||||
# endif
|
||||
}
|
||||
} else {
|
||||
piiu->contiguous_msg_count = 0;
|
||||
if (busy) {
|
||||
# ifdef DEBUG
|
||||
if (piiu->client_busy) {
|
||||
# if defined(DEBUG)
|
||||
printf("fc off\n");
|
||||
# endif
|
||||
ca_ready_message(piiu);
|
||||
|
||||
@@ -45,8 +45,6 @@ static char *sccsId = "@(#) $Id$";
|
||||
* also called by the server. All locks required are applied at
|
||||
* a higher level.
|
||||
*/
|
||||
#undef LOCK
|
||||
#undef UNLOCK
|
||||
|
||||
|
||||
/*
|
||||
@@ -295,9 +293,9 @@ void caDiscoverInterfaces(ELLLIST *pList, int socket, int port)
|
||||
continue;
|
||||
}
|
||||
|
||||
pNode->destAddr.inetAddr = *pInetAddr;
|
||||
pNode->destAddr.inetAddr.sin_port = htons(port);
|
||||
pNode->srcAddr.inetAddr = localAddr;
|
||||
pNode->destAddr.in = *pInetAddr;
|
||||
pNode->destAddr.in.sin_port = htons(port);
|
||||
pNode->srcAddr.in = localAddr;
|
||||
|
||||
/*
|
||||
* LOCK applied externally
|
||||
|
||||
356
src/ca/iocinf.c
356
src/ca/iocinf.c
@@ -1,4 +1,5 @@
|
||||
/************************************************************************/
|
||||
/* $Id$ */
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
/* Los Alamos National Laboratory */
|
||||
@@ -45,6 +46,10 @@
|
||||
/* 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$
|
||||
* Revision 1.60 1995/11/29 19:26:01 jhill
|
||||
* cleaned up interface to recv() and send()
|
||||
* */
|
||||
/* */
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
@@ -82,6 +87,7 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu);
|
||||
LOCAL void ca_process_udp(struct ioc_in_use *piiu);
|
||||
LOCAL void cacRingBufferInit(struct ca_buffer *pBuf, unsigned long size);
|
||||
LOCAL char *getToken(char **ppString);
|
||||
LOCAL void close_ioc (IIU *piiu);
|
||||
|
||||
|
||||
|
||||
@@ -95,7 +101,7 @@ LOCAL char *getToken(char **ppString);
|
||||
*/
|
||||
int alloc_ioc(
|
||||
const struct in_addr *pnet_addr,
|
||||
int port,
|
||||
unsigned short port,
|
||||
struct ioc_in_use **ppiiu
|
||||
)
|
||||
{
|
||||
@@ -148,7 +154,7 @@ struct ioc_in_use **ppiiu
|
||||
int create_net_chan(
|
||||
struct ioc_in_use **ppiiu,
|
||||
const struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
int port,
|
||||
unsigned short port,
|
||||
int net_proto
|
||||
)
|
||||
{
|
||||
@@ -156,7 +162,9 @@ int net_proto
|
||||
int status;
|
||||
SOCKET sock;
|
||||
int true = TRUE;
|
||||
#if 0
|
||||
struct sockaddr_in saddr;
|
||||
#endif
|
||||
caAddrNode *pNode;
|
||||
|
||||
LOCK;
|
||||
@@ -191,9 +199,9 @@ int net_proto
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
memset((char *)&pNode->destAddr,0,sizeof(pNode->destAddr));
|
||||
pNode->destAddr.inetAddr.sin_family = AF_INET;
|
||||
pNode->destAddr.inetAddr.sin_addr = *pnet_addr;
|
||||
pNode->destAddr.inetAddr.sin_port = htons (port);
|
||||
pNode->destAddr.in.sin_family = AF_INET;
|
||||
pNode->destAddr.in.sin_addr = *pnet_addr;
|
||||
pNode->destAddr.in.sin_port = htons (port);
|
||||
ellAdd(&piiu->destAddr, &pNode->node);
|
||||
piiu->recvBytes = tcp_recv_msg;
|
||||
piiu->sendBytes = cac_tcp_send_msg_piiu;
|
||||
@@ -324,8 +332,8 @@ int net_proto
|
||||
/* connect */
|
||||
status = connect(
|
||||
sock,
|
||||
&pNode->destAddr.sockAddr,
|
||||
sizeof(pNode->destAddr.sockAddr));
|
||||
&pNode->destAddr.sa,
|
||||
sizeof(pNode->destAddr.sa));
|
||||
if(status < 0){
|
||||
ca_printf("CAC: no conn err=\"%s\"\n", strerror(MYERRNO));
|
||||
status = socket_close(sock);
|
||||
@@ -394,13 +402,14 @@ int net_proto
|
||||
return ECA_CONN;
|
||||
}
|
||||
|
||||
#if 0
|
||||
memset((char *)&saddr,0,sizeof(saddr));
|
||||
saddr.sin_family = AF_INET;
|
||||
/*
|
||||
* 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,
|
||||
@@ -409,6 +418,7 @@ int net_proto
|
||||
ca_printf("CAC: bind (err=%s)\n",strerror(MYERRNO));
|
||||
ca_signal(ECA_INTERNAL,"bind failed");
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* load user and auto configured
|
||||
@@ -586,8 +596,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;
|
||||
@@ -662,10 +678,10 @@ 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));
|
||||
&pNode->destAddr.sa,
|
||||
sizeof(pNode->destAddr.sa));
|
||||
if(status>=0){
|
||||
actualSendCnt = (unsigned long) status;
|
||||
assert (actualSendCnt == sendCnt);
|
||||
@@ -741,26 +757,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;
|
||||
@@ -903,9 +917,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);
|
||||
@@ -928,7 +944,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);
|
||||
|
||||
@@ -937,13 +953,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;
|
||||
}
|
||||
@@ -982,7 +993,7 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu)
|
||||
/* post message to the user */
|
||||
status = post_msg(
|
||||
piiu,
|
||||
&pNode->destAddr.inetAddr.sin_addr,
|
||||
&pNode->destAddr.in.sin_addr,
|
||||
&piiu->recv.buf[piiu->recv.rdix],
|
||||
bytesToProcess);
|
||||
if(status != OK){
|
||||
@@ -1044,6 +1055,16 @@ 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));
|
||||
}
|
||||
else if(status > 0){
|
||||
@@ -1171,7 +1192,7 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
|
||||
*
|
||||
*
|
||||
*/
|
||||
void close_ioc (struct ioc_in_use *piiu)
|
||||
LOCAL void close_ioc (IIU *piiu)
|
||||
{
|
||||
caAddrNode *pNode;
|
||||
chid chix;
|
||||
@@ -1196,12 +1217,14 @@ void close_ioc (struct ioc_in_use *piiu)
|
||||
piiuCast = NULL;
|
||||
}
|
||||
else {
|
||||
chid pNext;
|
||||
|
||||
/*
|
||||
* remove IOC from the hash table
|
||||
*/
|
||||
pNode = (caAddrNode *) piiu->destAddr.node.next;
|
||||
assert (pNode);
|
||||
removeBeaconInetAddr (&pNode->destAddr.inetAddr.sin_addr);
|
||||
removeBeaconInetAddr (&pNode->destAddr.in.sin_addr);
|
||||
|
||||
/*
|
||||
* Mark all of their channels disconnected
|
||||
@@ -1209,73 +1232,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);
|
||||
@@ -1298,11 +1268,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;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@@ -1589,13 +1626,13 @@ char *localHostName()
|
||||
void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv,
|
||||
SOCKET socket, int port)
|
||||
{
|
||||
caAddrNode *pNode;
|
||||
ENV_PARAM list;
|
||||
char *pStr;
|
||||
char *pToken;
|
||||
union caAddr addr;
|
||||
union caAddr localAddr;
|
||||
int status;
|
||||
caAddrNode *pNode;
|
||||
ENV_PARAM list;
|
||||
char *pStr;
|
||||
char *pToken;
|
||||
caAddr addr;
|
||||
caAddr localAddr;
|
||||
int status;
|
||||
|
||||
pStr = envGetConfigParam(
|
||||
pEnv,
|
||||
@@ -1608,17 +1645,17 @@ void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv,
|
||||
/*
|
||||
* obtain a local address
|
||||
*/
|
||||
status = local_addr(socket, &localAddr.inetAddr);
|
||||
status = local_addr(socket, &localAddr.in);
|
||||
if(status){
|
||||
return;
|
||||
}
|
||||
|
||||
while(pToken = getToken(&pStr)){
|
||||
memset((char *)&addr,0,sizeof(addr));
|
||||
addr.inetAddr.sin_family = AF_INET;
|
||||
addr.inetAddr.sin_port = htons(port);
|
||||
addr.inetAddr.sin_addr.s_addr = inet_addr(pToken);
|
||||
if(addr.inetAddr.sin_addr.s_addr == -1){
|
||||
addr.in.sin_family = AF_INET;
|
||||
addr.in.sin_port = htons(port);
|
||||
addr.in.sin_addr.s_addr = inet_addr(pToken);
|
||||
if(addr.in.sin_addr.s_addr == -1){
|
||||
ca_printf(
|
||||
"%s: Parsing '%s'\n",
|
||||
__FILE__,
|
||||
@@ -1631,11 +1668,9 @@ void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv,
|
||||
|
||||
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
|
||||
if(pNode){
|
||||
pNode->destAddr.inetAddr = addr.inetAddr;
|
||||
pNode->srcAddr.inetAddr = localAddr.inetAddr;
|
||||
LOCK;
|
||||
pNode->destAddr.in = addr.in;
|
||||
pNode->srcAddr.in = localAddr.in;
|
||||
ellAdd(pList, &pNode->node);
|
||||
UNLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1690,12 +1725,12 @@ void caPrintAddrList(ELLLIST *pList)
|
||||
printf("Channel Access Address List\n");
|
||||
pNode = (caAddrNode *) ellFirst(pList);
|
||||
while(pNode){
|
||||
if(pNode->destAddr.sockAddr.sa_family != AF_INET){
|
||||
if(pNode->destAddr.sa.sa_family != AF_INET){
|
||||
printf("<addr entry not in internet format>");
|
||||
continue;
|
||||
}
|
||||
printf( "%s\n",
|
||||
inet_ntoa(pNode->destAddr.inetAddr.sin_addr));
|
||||
inet_ntoa(pNode->destAddr.in.sin_addr));
|
||||
|
||||
pNode = (caAddrNode *) ellNext(&pNode->node);
|
||||
}
|
||||
@@ -1705,7 +1740,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;
|
||||
@@ -1713,30 +1748,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,8 +29,23 @@
|
||||
/* .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$ */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/* $Log$
|
||||
* Revision 1.50 1995/10/18 16:45:40 jhill
|
||||
* Use recast delay greater than one vxWorks tick
|
||||
*
|
||||
* 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 */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -161,8 +176,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;
|
||||
@@ -193,8 +208,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) */
|
||||
|
||||
@@ -412,9 +431,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);
|
||||
@@ -433,6 +454,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;
|
||||
@@ -536,7 +558,7 @@ int post_msg(
|
||||
);
|
||||
int alloc_ioc(
|
||||
const struct in_addr *pnet_addr,
|
||||
int port,
|
||||
unsigned short port,
|
||||
struct ioc_in_use **ppiiu
|
||||
);
|
||||
unsigned long cacRingBufferWrite(
|
||||
@@ -570,7 +592,7 @@ char *localHostName(void);
|
||||
int create_net_chan(
|
||||
struct ioc_in_use **ppiiu,
|
||||
const struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
int port,
|
||||
unsigned short port,
|
||||
int net_proto
|
||||
);
|
||||
|
||||
@@ -584,7 +606,6 @@ void freeBeaconHash(struct ca_static *ca_temp);
|
||||
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);
|
||||
|
||||
@@ -607,7 +628,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!!
|
||||
|
||||
@@ -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,7 +36,7 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
|
||||
|
||||
/* TCP/UDP port number (bumped each protocol change) */
|
||||
#define CA_PROTOCOL_VERSION 4
|
||||
#define CA_MINOR_VERSION 5
|
||||
#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)
|
||||
@@ -39,18 +44,21 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
|
||||
#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
|
||||
|
||||
/*
|
||||
@@ -59,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)
|
||||
|
||||
@@ -104,6 +112,7 @@ typedef ca_uint32_t caResId;
|
||||
#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
|
||||
@@ -113,15 +122,15 @@ typedef ca_uint32_t caResId;
|
||||
#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)))
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
@@ -52,8 +54,13 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <net/if.h>
|
||||
# include <arpa/inet.h>
|
||||
# include <netdb.h>
|
||||
# include <sys/filio.h>
|
||||
# include <sys/sockio.h>
|
||||
/*
|
||||
* normally these are included by ioctl.h
|
||||
*/
|
||||
# ifdef SOLARIS
|
||||
# include <sys/filio.h>
|
||||
# include <sys/sockio.h>
|
||||
# endif
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif
|
||||
|
||||
@@ -307,12 +314,13 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# 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()
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.16 1995/10/12 01:35:28 jhill
|
||||
* Moved cac_mux_io() to iocinf.c
|
||||
*
|
||||
* Revision 1.15 1995/08/22 00:22:07 jhill
|
||||
* Dont recompute connection timers if the time stamp hasnt changed
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -54,41 +60,6 @@ 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();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cac_block_for_io_completion()
|
||||
@@ -255,11 +226,11 @@ void ca_spawn_repeater()
|
||||
* if here
|
||||
*/
|
||||
pImageName = "caRepeater";
|
||||
status = execlp(pImageName, NULL);
|
||||
status = execlp(pImageName, pImageName, NULL);
|
||||
if(status<0){
|
||||
ca_printf("!!WARNING!!\n");
|
||||
ca_printf("The executable \"%s\" couldnt be located\n", pImageName);
|
||||
ca_printf("because - %s\n", strerror(MYERRNO));
|
||||
ca_printf("because of errno = \"%s\"\n", strerror(MYERRNO));
|
||||
ca_printf("You may need to modify your PATH environment variable.\n");
|
||||
ca_printf("Creating CA repeater with fork() system call.\n");
|
||||
ca_printf("Repeater will inherit parents process name and resources.\n");
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* REPEATER.C
|
||||
*
|
||||
* CA broadcast repeater
|
||||
@@ -59,6 +61,8 @@
|
||||
* .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$";
|
||||
@@ -85,8 +89,8 @@ static char buf[MAX_UDP];
|
||||
|
||||
LOCAL void register_new_client(struct sockaddr_in *pLocal,
|
||||
struct sockaddr_in *pFrom);
|
||||
#define PORT_ANY 0
|
||||
LOCAL int makeSocket(int port);
|
||||
#define PORT_ANY 0U
|
||||
LOCAL SOCKET makeSocket(unsigned short port);
|
||||
LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize);
|
||||
|
||||
|
||||
@@ -104,7 +108,7 @@ void ca_repeater()
|
||||
struct sockaddr_in from;
|
||||
struct sockaddr_in local;
|
||||
int from_size = sizeof from;
|
||||
short port;
|
||||
unsigned short port;
|
||||
|
||||
port = caFetchPortConfig(
|
||||
&EPICS_CA_REPEATER_PORT,
|
||||
@@ -149,6 +153,15 @@ 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;
|
||||
@@ -241,11 +254,11 @@ LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize)
|
||||
/*
|
||||
* makeSocket()
|
||||
*/
|
||||
LOCAL int makeSocket(int port)
|
||||
LOCAL SOCKET makeSocket(unsigned short port)
|
||||
{
|
||||
int status;
|
||||
struct sockaddr_in bd;
|
||||
int sock;
|
||||
SOCKET sock;
|
||||
int true = 1;
|
||||
|
||||
sock = socket( AF_INET, /* domain */
|
||||
|
||||
@@ -263,8 +263,6 @@ const struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client write io id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -313,8 +311,6 @@ const 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;
|
||||
}
|
||||
|
||||
@@ -384,8 +380,6 @@ const struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client event id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -465,8 +459,6 @@ const struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!pIOBlock){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client read io id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -486,7 +478,8 @@ const 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);
|
||||
}
|
||||
@@ -640,9 +633,6 @@ const struct in_addr *pnet_addr
|
||||
if (pList) {
|
||||
ellDelete(pList, &monix->node);
|
||||
}
|
||||
else {
|
||||
printf ("CAC - Protocol err - no list for IO blk\n");
|
||||
}
|
||||
caIOBlockFree(monix);
|
||||
}
|
||||
|
||||
@@ -712,6 +702,31 @@ const 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);
|
||||
@@ -734,7 +749,7 @@ const struct in_addr *pnet_addr
|
||||
)
|
||||
{
|
||||
int v42;
|
||||
int port;
|
||||
unsigned short port;
|
||||
char rej[64];
|
||||
chid chan;
|
||||
int status;
|
||||
@@ -780,7 +795,7 @@ const struct in_addr *pnet_addr
|
||||
|
||||
pNode = (caAddrNode *) chpiiu->destAddr.node.next;
|
||||
assert(pNode);
|
||||
if (pNode->destAddr.inetAddr.sin_addr.s_addr !=
|
||||
if (pNode->destAddr.in.sin_addr.s_addr !=
|
||||
pnet_addr->s_addr) {
|
||||
|
||||
caHostFromInetAddr(pnet_addr,rej,sizeof(rej));
|
||||
@@ -828,7 +843,7 @@ const 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.
|
||||
*/
|
||||
@@ -979,9 +994,6 @@ chid chan
|
||||
/* decrement the outstanding IO count */
|
||||
CLRPENDRECV(TRUE);
|
||||
}
|
||||
|
||||
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
* 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
|
||||
@@ -249,7 +255,7 @@ int epicsShareAPI ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
/*
|
||||
* always flush at least once.
|
||||
*/
|
||||
ca_flush_io();
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
beg_time = ca_static->currentTime;
|
||||
@@ -520,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);
|
||||
}
|
||||
|
||||
14
src/ca/ucx.h
14
src/ca/ucx.h
@@ -8,6 +8,9 @@
|
||||
* CJM 13-Jul-1994 add fd_set etc for R3.12
|
||||
* CJM 09-Dec-1994 define fd_set etc. so it will compile for
|
||||
* both DEC C and Vax C
|
||||
* CJM 19-Nov-1995 use memset instead of bzero following advice
|
||||
* from Jeff Hill and add a definition of struct
|
||||
* timezone to support gettimeofday
|
||||
*
|
||||
*/
|
||||
#ifndef _UCX_H_
|
||||
@@ -80,12 +83,19 @@ 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)
|
||||
|
||||
struct timezone {
|
||||
int tz_minuteswest ; /* minutes west of Greenwich */
|
||||
int tz_dsttime ; /* type of dst correction */
|
||||
};
|
||||
|
||||
#define TWOPOWER32 4294967296.0
|
||||
#define TWOPOWER31 2147483648.0
|
||||
#define UNIX_EPOCH_AS_MJD 40587.0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -26,9 +26,18 @@
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* cjm 20-Nov-95 Add code for gettimeofday
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.18 1995/10/12 01:35:30 jhill
|
||||
* Moved cac_mux_io() to iocinf.c
|
||||
*
|
||||
* Revision 1.17 1995/08/22 00:27:56 jhill
|
||||
* added cvs style mod log
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -41,7 +50,13 @@
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
#ifdef UCX
|
||||
#include "ucx.h"
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#define CONNECTION_TIMER_ID 56
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ -58,41 +73,48 @@ void cac_gettimeval(struct timeval *pt)
|
||||
|
||||
|
||||
/*
|
||||
* 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
|
||||
* gettimeofday
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
#ifndef MULTINET
|
||||
int gettimeofday(struct timeval *tp, struct timezone *tzp)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
unsigned int quadtime[2] ;
|
||||
int status ;
|
||||
int nanosecs ;
|
||||
double secs ;
|
||||
int bit31 ;
|
||||
double dtime ; /* vax 64 bit integer as a double */
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
if (tp != (struct timeval *)NULL)
|
||||
{
|
||||
status = sys$gettim(&quadtime) ;
|
||||
if (status != SS$_NORMAL)
|
||||
return -1 ;
|
||||
else
|
||||
{
|
||||
bit31 = quadtime[0] & 0x80000000 ;
|
||||
dtime = quadtime[1]*TWOPOWER32 + (quadtime[0] & 0x7fffffff) ;
|
||||
if (bit31 != 0)
|
||||
dtime = (dtime + TWOPOWER31)/ 10000000.0 ;
|
||||
else
|
||||
dtime = dtime / 10000000.0 ;
|
||||
secs = dtime - UNIX_EPOCH_AS_MJD * 86400. ;
|
||||
tp->tv_sec = (int)secs ;
|
||||
tp->tv_usec = (int)((secs - tp->tv_sec)*1000000.0) ;
|
||||
}
|
||||
}
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
if (tzp != (struct timezone *)NULL)
|
||||
{
|
||||
tzp->tz_minuteswest = 0 ;
|
||||
tzp->tz_dsttime = 0 ;
|
||||
}
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
return 0 ;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
* 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
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -43,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()
|
||||
@@ -86,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()
|
||||
@@ -130,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
|
||||
/*
|
||||
@@ -198,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
|
||||
/*
|
||||
@@ -873,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
|
||||
|
||||
@@ -27,16 +27,22 @@
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Lawrence Berkley National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.19 1995/11/29 19:15:42 jhill
|
||||
* added $Log$ to the header
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Windows includes
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#include <mmsystem.h>
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
@@ -44,6 +50,10 @@
|
||||
#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,
|
||||
@@ -55,48 +65,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();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -139,8 +126,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;
|
||||
|
||||
@@ -154,10 +140,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 ();
|
||||
|
||||
@@ -291,21 +274,18 @@ 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){
|
||||
return;
|
||||
}
|
||||
broadcast_addr(&bcast_addr);
|
||||
pNode->destAddr.inetAddr.sin_addr.s_addr = bcast_addr.s_addr; //broadcast addr
|
||||
pNode->destAddr.inetAddr.sin_port = htons(port);
|
||||
pNode->destAddr.inetAddr.sin_family = AF_INET;
|
||||
//pNode->srcAddr.inetAddr = 0 ;//localAddr;
|
||||
pNode->destAddr.in.sin_addr.s_addr = bcast_addr.s_addr; //broadcast addr
|
||||
pNode->destAddr.in.sin_port = htons(port);
|
||||
pNode->destAddr.in.sin_family = AF_INET;
|
||||
//pNode->srcAddr.in = 0 ;//localAddr;
|
||||
|
||||
/*
|
||||
* LOCK applied externally
|
||||
@@ -353,6 +333,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
|
||||
@@ -361,37 +348,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -418,7 +433,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.
|
||||
@@ -439,34 +454,57 @@ 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
|
||||
|
||||
#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");
|
||||
}
|
||||
#endif
|
||||
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:
|
||||
@@ -475,4 +513,8 @@ BOOL epicsShareAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
18
src/cvtDctsdr/Makefile
Normal file
18
src/cvtDctsdr/Makefile
Normal 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
|
||||
|
||||
54
src/cvtDctsdr/Makefile.Unix
Normal file
54
src/cvtDctsdr/Makefile.Unix
Normal 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
12
src/cvtDctsdr/Makefile.Vx
Normal 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
199
src/cvtDctsdr/choice.h
Normal 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
46
src/cvtDctsdr/choiceGbl.h
Normal 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
94
src/cvtDctsdr/cvtTable.h
Normal 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
91
src/cvtDctsdr/dbBase.h
Normal 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
|
||||
72
src/cvtDctsdr/dbFldTypes.h
Normal file
72
src/cvtDctsdr/dbFldTypes.h
Normal 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
163
src/cvtDctsdr/dbRecDes.h
Normal 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
72
src/cvtDctsdr/dbRecType.h
Normal 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
104
src/cvtDctsdr/dbRecords.h
Normal 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
|
||||
@@ -57,15 +57,6 @@
|
||||
|
||||
#define messagesize 100
|
||||
#define RPCL_LEN 184
|
||||
|
||||
#if defined(EPICS_LITTLE_ENDIAN)
|
||||
#define BYTE_SWAP_4(A) \
|
||||
( (((A) & 0xFF) << 24 ) | \
|
||||
(((A) & 0xFF00) << 8) | \
|
||||
(((A) & 0xFF0000) >> 8) | \
|
||||
(((A) & 0xFF000000) >> 24) )
|
||||
#endif
|
||||
|
||||
long postfix(char *pinfix, char *ppostfix,short *perror);
|
||||
|
||||
static char *ppstring[2]={"NPP","PP"};
|
||||
@@ -749,7 +740,7 @@ char *precordName;
|
||||
struct recLoc *precLoc = NULL;
|
||||
short rec_size;
|
||||
|
||||
if(strlen(precordName)>(size_t)PVNAME_SZ) return(S_dbLib_nameLength);
|
||||
if(strlen(precordName)>PVNAME_SZ) return(S_dbLib_nameLength);
|
||||
/* clear callers entry */
|
||||
zeroDbentry(pdbentry);
|
||||
if(!dbFindRecord(pdbentry,precordName)) return (S_dbLib_recExists);
|
||||
@@ -947,7 +938,7 @@ char *newName;
|
||||
long status;
|
||||
DBENTRY dbentry;
|
||||
|
||||
if(strlen(newName)>(size_t)PVNAME_SZ) return(S_dbLib_nameLength);
|
||||
if(strlen(newName)>PVNAME_SZ) return(S_dbLib_nameLength);
|
||||
if(!precnode) return(S_dbLib_recNotFound);
|
||||
dbInitEntry(pdbentry->pdbbase,&dbentry);
|
||||
status = dbFindRecord(&dbentry,newName);
|
||||
@@ -1017,23 +1008,15 @@ char *pfieldName;
|
||||
bottom = 0;
|
||||
test = (top + bottom) / 2;
|
||||
while (1) {
|
||||
unsigned int t1, t2;
|
||||
|
||||
/* check the field name */
|
||||
t1 = (unsigned int) sortFldName[ test];
|
||||
t2 = (unsigned int) *(unsigned int*)pconvName;
|
||||
#if defined(EPICS_LITTLE_ENDIAN)
|
||||
t1 = BYTE_SWAP_4( t1);
|
||||
t2 = BYTE_SWAP_4( t2);
|
||||
#endif
|
||||
if(t1 == t2) {
|
||||
if (sortFldName[test] == *(unsigned long *) pconvName) {
|
||||
if(!(pflddes=GET_PFLDDES(precTypDes,sortFldInd[test])))
|
||||
return(S_dbLib_recdesNotFound);
|
||||
pdbentry->pflddes = pflddes;
|
||||
pdbentry->pfield = precord + pflddes->offset;
|
||||
pdbentry->indfield = sortFldInd[test];
|
||||
return (0);
|
||||
} else if (t1 > t2) {
|
||||
} else if (sortFldName[test] > *(unsigned long *) pconvName) {
|
||||
top = test - 1;
|
||||
if (top < bottom) return (S_dbLib_fieldNotFound);
|
||||
test = (top + bottom) / 2;
|
||||
@@ -1608,7 +1591,7 @@ char *pstring;
|
||||
if (!(pchoice = pdevChoiceSet->papDevChoice[i]->pchoice))
|
||||
continue;
|
||||
if (strcmp(pchoice, pstring) == 0) {
|
||||
long link_type;
|
||||
long link_type,status;
|
||||
|
||||
link_type = pdevChoiceSet->papDevChoice[i]->link_type;
|
||||
/*If no INP or OUT OK */
|
||||
@@ -1640,7 +1623,7 @@ char *pstring;
|
||||
if(pstr[ind]!=' ' && pstr[ind]!='\t') break;
|
||||
pstr[ind] = '\0';
|
||||
}
|
||||
if(!pstr || strlen(pstr)==0 ) {
|
||||
if(!pstr || strlen(pstr)<=0 ) {
|
||||
if(plink->type==PV_LINK) dbCvtLinkToConstant(pdbentry);
|
||||
if(plink->type!=CONSTANT) return(S_dbLib_badField);
|
||||
return(0);
|
||||
@@ -1706,18 +1689,12 @@ char *pstring;
|
||||
if(!(end = strchr(pstr,'N'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.camacio.n);
|
||||
if(!(end = strchr(pstr,'A'))) {
|
||||
plink->value.camacio.a = 0;
|
||||
} else {
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.camacio.a);
|
||||
}
|
||||
if(!(end = strchr(pstr,'F'))) {
|
||||
plink->value.camacio.f = 0;
|
||||
} else {
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.camacio.f);
|
||||
}
|
||||
if(!(end = strchr(pstr,'A'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.camacio.a);
|
||||
if(!(end = strchr(pstr,'F'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.camacio.f);
|
||||
plink->value.camacio.parm[0] = 0;
|
||||
if(end = strchr(pstr,'@')) {
|
||||
pstr = end + 1;
|
||||
@@ -4150,23 +4127,10 @@ FILE *fp;
|
||||
}
|
||||
|
||||
/* Beginning of Process Variable Directory Routines*/
|
||||
int dbPvdHashTableSize = 512;
|
||||
static int dbPvdHashTableShift;
|
||||
#define NTABLESIZES 9
|
||||
static struct {
|
||||
unsigned int tablesize;
|
||||
int shift;
|
||||
}hashTableParms[9] = {
|
||||
{256,0},
|
||||
{512,1},
|
||||
{1024,2},
|
||||
{2048,3},
|
||||
{4096,4},
|
||||
{8192,5},
|
||||
{16384,6},
|
||||
{32768,7},
|
||||
{65536,8}
|
||||
};
|
||||
#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 */
|
||||
@@ -4208,7 +4172,7 @@ static unsigned short hash( char *pname, int length)
|
||||
}
|
||||
ind0 = (unsigned short)h0;
|
||||
ind1 = (unsigned short)h1;
|
||||
return((ind1<<dbPvdHashTableShift) ^ ind0);
|
||||
return((ind1<<SHIFT) ^ ind0);
|
||||
}
|
||||
|
||||
#ifdef __STDC__
|
||||
@@ -4218,19 +4182,9 @@ void dbPvdInitPvt(pdbbase)
|
||||
DBBASE *pdbbase;
|
||||
#endif /*__STDC__*/
|
||||
{
|
||||
ELLLIST **ppvd;
|
||||
int i;
|
||||
ELLLIST **ppvd;
|
||||
|
||||
for(i=0; i< NTABLESIZES; i++) {
|
||||
if((i==NTABLESIZES-1)
|
||||
||((dbPvdHashTableSize>=hashTableParms[i].tablesize)
|
||||
&& (dbPvdHashTableSize<hashTableParms[i+1].tablesize))) {
|
||||
dbPvdHashTableSize = hashTableParms[i].tablesize;
|
||||
dbPvdHashTableShift = hashTableParms[i].shift;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ppvd = dbCalloc(dbPvdHashTableSize, sizeof(ELLLIST *));
|
||||
ppvd = dbCalloc(HASH_NO, sizeof(ELLLIST *));
|
||||
pdbbase->ppvd = (void *) ppvd;
|
||||
return;
|
||||
}
|
||||
@@ -4340,7 +4294,7 @@ DBBASE *pdbbase;
|
||||
PVDENTRY *next;
|
||||
|
||||
if (ppvd == NULL) return;
|
||||
for (hashInd=0; hashInd<(unsigned short)dbPvdHashTableSize; hashInd++) {
|
||||
for (hashInd=0; hashInd<HASH_NO; hashInd++) {
|
||||
if(ppvd[hashInd] == NULL) continue;
|
||||
ppvdlist=ppvd[hashInd];
|
||||
ppvdNode = (PVDENTRY *) ellFirst(ppvdlist);
|
||||
@@ -4356,11 +4310,10 @@ DBBASE *pdbbase;
|
||||
}
|
||||
|
||||
#ifdef __STDC__
|
||||
void dbPvdDump(DBBASE *pdbbase,int verbose)
|
||||
void dbPvdDump(DBBASE *pdbbase)
|
||||
#else
|
||||
void dbPvdDump(pdbbase,verbose)
|
||||
void dbPvdDump(pdbbase)
|
||||
DBBASE *pdbbase;
|
||||
int verbose;
|
||||
#endif /*__STDC__*/
|
||||
{
|
||||
unsigned short hashInd;
|
||||
@@ -4370,16 +4323,14 @@ int verbose;
|
||||
int number;
|
||||
|
||||
if (ppvd == NULL) return;
|
||||
printf("Process Variable Directory ");
|
||||
printf("dbPvdHashTableSize %d dbPvdHashTableShift %d\n",
|
||||
dbPvdHashTableSize,dbPvdHashTableShift);
|
||||
for (hashInd=0; hashInd<(unsigned short)dbPvdHashTableSize; hashInd++) {
|
||||
printf("Process Variable Directory\n");
|
||||
for (hashInd=0; hashInd<HASH_NO; hashInd++) {
|
||||
if(ppvd[hashInd] == NULL) continue;
|
||||
ppvdlist=ppvd[hashInd];
|
||||
ppvdNode = (PVDENTRY *) ellFirst(ppvdlist);
|
||||
printf("\n%3.3hd=%3.3d ",hashInd,ellCount(ppvdlist));
|
||||
printf(" %3.3hd=%3.3d\n",hashInd,ellCount(ppvdlist));
|
||||
number=0;
|
||||
while(ppvdNode && verbose) {
|
||||
while(ppvdNode) {
|
||||
printf(" %s",(char *)ppvdNode->precnode->precord);
|
||||
if(number++ ==2) {number=0;printf("\n ");}
|
||||
ppvdNode = (PVDENTRY *) ellNext((ELLNODE*)ppvdNode);
|
||||
282
src/cvtDctsdr/dbStaticLib.h
Normal file
282
src/cvtDctsdr/dbStaticLib.h
Normal 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
133
src/cvtDctsdr/devSup.h
Normal 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
112
src/cvtDctsdr/drvSup.h
Normal 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
118
src/cvtDctsdr/errMdef.h
Normal 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
189
src/cvtDctsdr/link.h
Normal 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
233
src/cvtDctsdr/recSup.h
Normal 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
123
src/cvtDctsdr/sdr2device.c
Normal 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.db");
|
||||
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);
|
||||
}
|
||||
@@ -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.db");
|
||||
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
115
src/cvtDctsdr/sdr2gblmenu.c
Normal 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,".db");
|
||||
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);
|
||||
}
|
||||
439
src/cvtDctsdr/sdr2recordtype.c
Normal file
439
src/cvtDctsdr/sdr2recordtype.c
Normal 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,".db");
|
||||
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.db\" \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
80
src/cvtDctsdr/sdrHeader.h
Normal 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
36
src/cvtDctsdr/sf2db.1
Normal 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
26
src/cvtDctsdr/sf2dbLex.l
Executable 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
151
src/cvtDctsdr/sf2dbYacc.y
Executable 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
54
src/cvtDctsdr/special.h
Normal 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
|
||||
49
src/cvtDctsdr/test/generateAllAscii
Executable file
49
src/cvtDctsdr/test/generateAllAscii
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/sh
|
||||
BIN=../O.solaris
|
||||
H=/usr/local/epics/R3.12.2/base/rec
|
||||
/bin/rm *.db
|
||||
$BIN/sdr2gblmenu
|
||||
$BIN/sdr2recordtype dbCommon $H/dbCommon.h
|
||||
$BIN/sdr2recordtype ai $H/aiRecord.h
|
||||
$BIN/sdr2recordtype ao $H/aoRecord.h
|
||||
$BIN/sdr2recordtype aai $H/aaiRecord.h
|
||||
$BIN/sdr2recordtype aao $H/aaoRecord.h
|
||||
$BIN/sdr2recordtype bi $H/biRecord.h
|
||||
$BIN/sdr2recordtype bo $H/boRecord.h
|
||||
$BIN/sdr2recordtype calc $H/calcRecord.h
|
||||
$BIN/sdr2recordtype compress $H/compressRecord.h
|
||||
$BIN/sdr2recordtype dfanout $H/dfanoutRecord.h
|
||||
$BIN/sdr2recordtype eg $H/egRecord.h
|
||||
$BIN/sdr2recordtype egevent $H/egeventRecord.h
|
||||
$BIN/sdr2recordtype er $H/erRecord.h
|
||||
$BIN/sdr2recordtype erevent $H/ereventRecord.h
|
||||
$BIN/sdr2recordtype event $H/eventRecord.h
|
||||
$BIN/sdr2recordtype fanout $H/fanoutRecord.h
|
||||
$BIN/sdr2recordtype histogram $H/histogramRecord.h
|
||||
$BIN/sdr2recordtype longin $H/longinRecord.h
|
||||
$BIN/sdr2recordtype longout $H/longoutRecord.h
|
||||
$BIN/sdr2recordtype mbbiDirect $H/mbbiDirectRecord.h
|
||||
$BIN/sdr2recordtype mbbi $H/mbbiRecord.h
|
||||
$BIN/sdr2recordtype mbboDirect $H/mbboDirectRecord.h
|
||||
$BIN/sdr2recordtype mbbo $H/mbboRecord.h
|
||||
$BIN/sdr2recordtype permissive $H/permissiveRecord.h
|
||||
$BIN/sdr2recordtype pid $H/pidRecord.h
|
||||
$BIN/sdr2recordtype pulseCounter $H/pulseCounterRecord.h
|
||||
$BIN/sdr2recordtype pulseDelay $H/pulseDelayRecord.h
|
||||
$BIN/sdr2recordtype pulseTrain $H/pulseTrainRecord.h
|
||||
$BIN/sdr2recordtype scan $H/scanRecord.h
|
||||
$BIN/sdr2recordtype sel $H/selRecord.h
|
||||
$BIN/sdr2recordtype seq $H/seqRecord.h
|
||||
$BIN/sdr2recordtype state $H/stateRecord.h
|
||||
$BIN/sdr2recordtype steppermotor $H/steppermotorRecord.h
|
||||
$BIN/sdr2recordtype stringin $H/stringinRecord.h
|
||||
$BIN/sdr2recordtype stringout $H/stringoutRecord.h
|
||||
$BIN/sdr2recordtype subArray $H/subArrayRecord.h
|
||||
$BIN/sdr2recordtype sub $H/subRecord.h
|
||||
$BIN/sdr2recordtype gsub $H/gsubRecord.h
|
||||
$BIN/sdr2recordtype pal $H/palRecord.h
|
||||
$BIN/sdr2recordtype timer $H/timerRecord.h
|
||||
$BIN/sdr2recordtype wait $H/waitRecord.h
|
||||
$BIN/sdr2recordtype waveform $H/waveformRecord.h
|
||||
$BIN/sdr2device
|
||||
$BIN/sdr2driver
|
||||
@@ -2,44 +2,24 @@ 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
|
||||
INC += drvTS.h
|
||||
INC += drvSup.h
|
||||
INC += callback.h
|
||||
INC += dbAccess.h
|
||||
INC += dbConvert.h
|
||||
INC += dbEvent.h
|
||||
INC += dbScan.h
|
||||
INC += db_access.h
|
||||
INC += db_addr.h
|
||||
INC += db_field_log.h
|
||||
INC += fast_lock.h
|
||||
INC += initHooks.h
|
||||
INC += recSup.h
|
||||
INC += devSup.h
|
||||
INC += task_params.h
|
||||
INC += taskwd.h
|
||||
INC += recGbl.h
|
||||
INC += dbBkpt.h
|
||||
INC += devLib.h
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -5,18 +5,65 @@ 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
|
||||
|
||||
DBINSTALL += dbCommonRecord.db
|
||||
DBINSTALL += menuGlobal.db
|
||||
DBINSTALL += epics.db
|
||||
DBINSTALL += epicsLIBOBJS
|
||||
|
||||
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 ../cvtBpt.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
|
||||
|
||||
LIBOBJS = \
|
||||
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 cvtBpt.o
|
||||
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
|
||||
|
||||
@@ -24,3 +71,12 @@ LIBNAME = dbLib
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
dbCommon.h: ../dbCommonRecord.db dbCommon.db
|
||||
$(RM) $@
|
||||
$(EPICS_BASE)/bin/$(HOST_ARCH)/dbToRecordtypeH $<
|
||||
|
||||
dbCommon.db: ../dbCommon.db
|
||||
@test -f $@ || ln -s $< $@
|
||||
|
||||
clean::
|
||||
@$(RM) dbCommon.db rec base
|
||||
|
||||
@@ -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++; }
|
||||
|
||||
%%
|
||||
@@ -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)>(size_t)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"
|
||||
@@ -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);
|
||||
|
||||
86
src/db/callback.h
Normal file
86
src/db/callback.h
Normal file
@@ -0,0 +1,86 @@
|
||||
/* $Id$ */
|
||||
|
||||
/* includes for general purpose callback tasks */
|
||||
/*
|
||||
* Original Author: Marty Kraimer
|
||||
* Date: 07-18-91
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 12-12-91 mrk Initial version
|
||||
* .02 04-05-94 mrk Remove casts on Lvalues (ANSI forbids)
|
||||
* .02 02-09-95 joh if def'd out typedef CALLBACK for
|
||||
* windows
|
||||
*/
|
||||
|
||||
|
||||
#ifndef INCcallbackh
|
||||
#define INCcallbackh 1
|
||||
|
||||
/*
|
||||
* WINDOWS also has a "CALLBACK" type def
|
||||
*/
|
||||
#ifdef WIN32
|
||||
# ifdef CALLBACK
|
||||
# undef CALLBACK
|
||||
# endif /*CALLBACK*/
|
||||
#endif /*WIN32*/
|
||||
|
||||
#define NUM_CALLBACK_PRIORITIES 3
|
||||
#define priorityLow 0
|
||||
#define priorityMedium 1
|
||||
#define priorityHigh 2
|
||||
|
||||
typedef struct callbackPvt {
|
||||
#ifdef __cplusplus
|
||||
void (*callback)(struct callbackPvt*);
|
||||
#else
|
||||
void (*callback)();
|
||||
#endif
|
||||
int priority;
|
||||
void *user; /*for use by callback user*/
|
||||
}CALLBACK;
|
||||
|
||||
#define callbackSetCallback(PFUN,PCALLBACK)\
|
||||
( (PCALLBACK)->callback = (PFUN) )
|
||||
#define callbackSetPriority(PRIORITY,PCALLBACK)\
|
||||
( (PCALLBACK)->priority = (PRIORITY) )
|
||||
#define callbackSetUser(USER,PCALLBACK)\
|
||||
( (PCALLBACK)->user = (VOID *)(USER) )
|
||||
#define callbackGetUser(USER,PCALLBACK)\
|
||||
( (USER) = (void *)((CALLBACK *)(PCALLBACK))->user )
|
||||
|
||||
#ifdef __STDC__
|
||||
long callbackInit();
|
||||
void callbackRequest(CALLBACK *);
|
||||
void callbackRequestProcessCallback(CALLBACK *pCallback,
|
||||
int Priority, void *pRec);
|
||||
#else
|
||||
long callbackInit();
|
||||
void callbackRequest();
|
||||
void callbackRequestProcessCallback();
|
||||
#endif /*__STDC__*/
|
||||
|
||||
|
||||
#endif /*INCcallbackh*/
|
||||
File diff suppressed because it is too large
Load Diff
318
src/db/dbAccess.h
Normal file
318
src/db/dbAccess.h
Normal file
@@ -0,0 +1,318 @@
|
||||
/* dbAccess.h */
|
||||
/* $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 03-04-92 jba Replaced dbr_value_size with dbrValueSize in dbAccess
|
||||
* .03 05-28-92 mrk cleanup
|
||||
* .04 08-19-92 jba added prototypes dbCaAddInlink,dbCaAddOutlink
|
||||
* .05 08-19-92 jba added prototypes dbCaPutLink,dbCaGetLink
|
||||
* .06 02-02-94 mrk added definitions for dbPutNotify
|
||||
* .07 03-18-94 mcn added breakpoint codes, fast link protos
|
||||
*/
|
||||
|
||||
#ifndef INCdbAccessh
|
||||
#define INCdbAccessh
|
||||
#include <dbDefs.h>
|
||||
#include <dbBase.h>
|
||||
#include <dbFldTypes.h>
|
||||
#include <link.h>
|
||||
#include <tsDefs.h>
|
||||
#include <callback.h>
|
||||
#include <ellLib.h>
|
||||
#include <caeventmask.h>
|
||||
|
||||
typedef struct dbAddr{
|
||||
struct dbCommon *precord;/* address of record */
|
||||
void *pfield; /* address of field */
|
||||
void *pfldDes; /* address of struct fldDes */
|
||||
void *asPvt; /* Access Security Private */
|
||||
long no_elements; /* number of elements (arrays) */
|
||||
short field_type; /* type of database field */
|
||||
short field_size; /* size (bytes) of the field being accessed */
|
||||
short special; /* special processing */
|
||||
short dbr_field_type; /* field type as seen by database request*/
|
||||
/*DBR_STRING,...,DBR_ENUM,DBR_NOACCESS*/
|
||||
}DBADDR;
|
||||
|
||||
/*If the following structures changes then db_access.h must also be changed*/
|
||||
typedef struct pnRestartNode {
|
||||
ELLNODE node;
|
||||
struct putNotify *ppn;
|
||||
struct putNotify *ppnrestartList; /*ppn with restartList*/
|
||||
}PNRESTARTNODE;
|
||||
|
||||
|
||||
typedef struct putNotify{
|
||||
/*The following members MUST be set by user*/
|
||||
#ifdef __STDC__
|
||||
void (*userCallback)(struct putNotify *); /*callback provided by user*/
|
||||
#else
|
||||
void (*userCallback)(); /*callback provided by user*/
|
||||
#endif
|
||||
struct dbAddr *paddr; /*dbAddr set by dbNameToAddr*/
|
||||
void *pbuffer; /*address of data*/
|
||||
long nRequest; /*number of elements to be written*/
|
||||
short dbrType; /*database request type*/
|
||||
void *usrPvt; /*for private use of user*/
|
||||
/*The following is status of request. Set by dbPutNotify*/
|
||||
long status;
|
||||
/*The following are private to database access*/
|
||||
CALLBACK callback;
|
||||
ELLLIST waitList; /*list of records for which to wait*/
|
||||
ELLLIST restartList; /*list of PUTNOTIFYs to restart*/
|
||||
PNRESTARTNODE restartNode;
|
||||
short restart;
|
||||
short callbackState;
|
||||
void *waitForCallback;
|
||||
}PUTNOTIFY;
|
||||
|
||||
/* The database field and request types are defined in dbFldTypes.h*/
|
||||
/* Data Base Request Options */
|
||||
#define DBR_STATUS 0x00000001
|
||||
#define DBR_UNITS 0x00000002
|
||||
#define DBR_PRECISION 0x00000004
|
||||
#define DBR_TIME 0x00000008
|
||||
#define DBR_ENUM_STRS 0x00000010
|
||||
#define DBR_GR_LONG 0x00000020
|
||||
#define DBR_GR_DOUBLE 0x00000040
|
||||
#define DBR_CTRL_LONG 0x00000080
|
||||
#define DBR_CTRL_DOUBLE 0x00000100
|
||||
#define DBR_AL_LONG 0x00000200
|
||||
#define DBR_AL_DOUBLE 0x00000400
|
||||
|
||||
/**********************************************************************
|
||||
* The next page contains macros for defining requests.
|
||||
* As an example the following defines a buffer to accept an array
|
||||
* of 10 float values + DBR_STATUS and DBR_TIME options
|
||||
*
|
||||
* struct {
|
||||
* DBRstatus
|
||||
* DBRtime
|
||||
* float value[10]
|
||||
* } buffer;
|
||||
*
|
||||
* IMPORTANT!! The DBRoptions must be given in the order that they
|
||||
* appear in the Data Base Request Options #defines
|
||||
*
|
||||
* The associated dbGetField call is:
|
||||
*
|
||||
* long options,number_elements;
|
||||
* ...
|
||||
* options = DBR_STATUS|DBR_TIME;
|
||||
* number_elements = 10;
|
||||
* rtnval=dbGetField(paddr,DBR_FLOAT,&buffer,&options,&number_elements);
|
||||
*
|
||||
* When dbGetField returns:
|
||||
* rtnval is error status (0 means success)
|
||||
* options has a bit set for each option that was accepted
|
||||
* number_elements is actual number of elements obtained
|
||||
*
|
||||
* The individual items can be refered to by the expressions::
|
||||
*
|
||||
* buffer.status
|
||||
* buffer.severity
|
||||
* buffer.err_status
|
||||
* buffer.epoch_seconds
|
||||
* buffer.nano_seconds
|
||||
* buffer.value[i]
|
||||
*
|
||||
* The following is also a valid declaration:
|
||||
*
|
||||
* typedef struct {
|
||||
* DBRstatus
|
||||
* DBRtime
|
||||
* float value[10]
|
||||
* } MYBUFFER;
|
||||
*
|
||||
* With this definition you can give definitions such as the following:
|
||||
*
|
||||
* MYBUFFER *pbuf1;
|
||||
* MYBUFFER buf;
|
||||
*************************************************************************/
|
||||
|
||||
/* Macros for defining each option */
|
||||
#define DBRstatus \
|
||||
unsigned short status; /* alarm status */\
|
||||
unsigned short severity; /* alarm severity*/\
|
||||
unsigned short acks; /* alarm ack severity*/\
|
||||
unsigned short ackt; /* Acknowledge transient alarms?*/
|
||||
#define DB_UNITS_SIZE 16
|
||||
#define DBRunits \
|
||||
char units[DB_UNITS_SIZE]; /* units */
|
||||
#define DBRprecision \
|
||||
long precision; /* number of decimal places*/\
|
||||
long field_width; /* field width */
|
||||
#define DBRtime \
|
||||
TS_STAMP time; /* time stamp*/
|
||||
#define DBRenumStrs \
|
||||
unsigned long no_str; /* number of strings*/\
|
||||
long padenumStrs; /*padding to force 8 byte align*/\
|
||||
char strs[DB_MAX_CHOICES][MAX_STRING_SIZE]; /* string values */
|
||||
#define DBRgrLong \
|
||||
long upper_disp_limit; /*upper limit of graph*/\
|
||||
long lower_disp_limit; /*lower limit of graph*/
|
||||
#define DBRgrDouble \
|
||||
double upper_disp_limit; /*upper limit of graph*/\
|
||||
double lower_disp_limit; /*lower limit of graph*/
|
||||
#define DBRctrlLong \
|
||||
long upper_ctrl_limit; /*upper limit of graph*/\
|
||||
long lower_ctrl_limit; /*lower limit of graph*/
|
||||
#define DBRctrlDouble \
|
||||
double upper_ctrl_limit; /*upper limit of graph*/\
|
||||
double lower_ctrl_limit; /*lower limit of graph*/
|
||||
#define DBRalLong \
|
||||
long upper_alarm_limit;\
|
||||
long upper_warning_limit;\
|
||||
long lower_warning_limit;\
|
||||
long lower_alarm_limit;
|
||||
#define DBRalDouble \
|
||||
double upper_alarm_limit;\
|
||||
double upper_warning_limit;\
|
||||
double lower_warning_limit;\
|
||||
double lower_alarm_limit;
|
||||
|
||||
/* structures for each option type */
|
||||
struct dbr_status {DBRstatus};
|
||||
struct dbr_units {DBRunits};
|
||||
struct dbr_precision {DBRprecision};
|
||||
struct dbr_time {DBRtime};
|
||||
struct dbr_enumStrs {DBRenumStrs};
|
||||
struct dbr_grLong {DBRgrLong};
|
||||
struct dbr_grDouble {DBRgrDouble};
|
||||
struct dbr_ctrlLong {DBRctrlLong};
|
||||
struct dbr_ctrlDouble {DBRctrlDouble};
|
||||
struct dbr_alLong {DBRalLong};
|
||||
struct dbr_alDouble {DBRalDouble};
|
||||
/* sizes for each option structure */
|
||||
#define dbr_status_size sizeof(struct dbr_status)
|
||||
#define dbr_units_size sizeof(struct dbr_units)
|
||||
#define dbr_precision_size sizeof(struct dbr_precision)
|
||||
#define dbr_time_size sizeof(struct dbr_time)
|
||||
#define dbr_enumStrs_size sizeof(struct dbr_enumStrs)
|
||||
#define dbr_grLong_size sizeof(struct dbr_grLong)
|
||||
#define dbr_grDouble_size sizeof(struct dbr_grDouble)
|
||||
#define dbr_ctrlLong_size sizeof(struct dbr_ctrlLong)
|
||||
#define dbr_ctrlDouble_size sizeof(struct dbr_ctrlDouble)
|
||||
#define dbr_alLong_size sizeof(struct dbr_alLong)
|
||||
#define dbr_alDouble_size sizeof(struct dbr_alDouble)
|
||||
|
||||
#ifndef INCerrMdefh
|
||||
#include <errMdef.h>
|
||||
#endif
|
||||
#define S_db_notFound (M_dbAccess| 1) /*Process Variable Not Found*/
|
||||
#define S_db_badDbrtype (M_dbAccess| 3) /*Illegal Database Request Type*/
|
||||
#define S_db_noMod (M_dbAccess| 5) /*Attempt to modify noMod field*/
|
||||
#define S_db_badLset (M_dbAccess| 7) /*Illegal Lock Set*/
|
||||
#define S_db_precision (M_dbAccess| 9) /*get precision failed */
|
||||
#define S_db_onlyOne (M_dbAccess|11) /*Only one element allowed*/
|
||||
#define S_db_badChoice (M_dbAccess|13) /*Illegal choice*/
|
||||
#define S_db_badField (M_dbAccess|15) /*Illegal field value*/
|
||||
#define S_db_lsetLogic (M_dbAccess|17) /*Logic error generating lock sets*/
|
||||
#define S_db_noRSET (M_dbAccess|31) /*missing record support entry table*/
|
||||
#define S_db_noSupport (M_dbAccess|33) /*RSET routine not defined*/
|
||||
#define S_db_BadSub (M_dbAccess|35) /*Subroutine not found*/
|
||||
/*!!!! Do not change next two lines without changing src/rsrv/server.h!!!!!!!!*/
|
||||
#define S_db_Pending (M_dbAccess|37) /*Request is pending*/
|
||||
#define S_db_Blocked (M_dbAccess|39) /*Request is Blocked*/
|
||||
#define S_db_putDisabled (M_dbAccess|41) /*putFields are disabled*/
|
||||
#define S_db_bkptSet (M_dbAccess|53) /*Breakpoint already set*/
|
||||
#define S_db_bkptNotSet (M_dbAccess|55) /*No breakpoint set in record*/
|
||||
#define S_db_notStopped (M_dbAccess|57) /*Record not stopped*/
|
||||
#define S_db_errArg (M_dbAccess|59) /*Error in argument*/
|
||||
#define S_db_bkptLogic (M_dbAccess|61) /*Logic error in breakpoint routine*/
|
||||
#define S_db_cntSpwn (M_dbAccess|63) /*Cannot spawn dbContTask*/
|
||||
#define S_db_cntCont (M_dbAccess|65) /*Cannot resume dbContTask*/
|
||||
|
||||
/* Global Database Access Routines*/
|
||||
#ifdef __STDC__
|
||||
struct rset *dbGetRset(struct dbAddr *paddr);
|
||||
int dbIsValueField(struct dbFldDes *pdbFldDes);
|
||||
int dbGetFieldIndex(struct dbAddr *paddr);
|
||||
long dbCommonInit(struct dbCommon *precord, int pass);
|
||||
void dbScanLock(struct dbCommon *precord);
|
||||
void dbScanUnlock(struct dbCommon *precord);
|
||||
void dbScanLockInit(int nset);
|
||||
long dbScanPassive(struct dbCommon *pfrom,struct dbCommon *pto);
|
||||
long dbProcess(struct dbCommon *precord);
|
||||
long dbNameToAddr(char *pname,struct dbAddr *);
|
||||
long dbGetLink(struct db_link *,struct dbCommon *precord,short dbrType,
|
||||
void *pbuffer,long *options,long *nRequest);
|
||||
long dbPutField(struct dbAddr *,short dbrType,void *pbuffer,long nRequest);
|
||||
long dbPutNotify(PUTNOTIFY *pputnotify);
|
||||
/*dbNotifyAdd called by dbScanPassive and dbScanLink*/
|
||||
void dbNotifyAdd(struct dbCommon *pfrom,struct dbCommon *pto);
|
||||
void dbNotifyCancel(PUTNOTIFY *pputnotify);
|
||||
/*dbNotifyCompletion called by recGblFwdLink and dbProcess */
|
||||
void dbNotifyCompletion(struct dbCommon *precord); /*called only by recGblFwdLink*/
|
||||
long dbPut(struct dbAddr *,short dbrType,void *pbuffer,long nRequest);
|
||||
long dbGetField(struct dbAddr *,short dbrType,void *pbuffer,long *options,long *nRequest,void *pfl);
|
||||
long dbGet(struct dbAddr *,short dbrType,void *pbuffer,long *options,long *nRequest,void *pfl);
|
||||
long dbPutLink(struct db_link *,struct dbCommon *precord,short dbrType,
|
||||
void *pbuffer,long nRequest);
|
||||
long dbBufferSize(short dbrType,long options,long nRequest);
|
||||
long dbValueSize(short dbrType);
|
||||
|
||||
long dbCaAddInlink(struct link *plink,void *pdest_record,char *dest_fieldname);
|
||||
long dbCaAddOutlink(struct link *plink,void *psource_record,char *source_fieldname);
|
||||
long dbCaPutLink(struct link *plink,long *poptions,long *pnRequest);
|
||||
long dbCaGetLink(struct link *plink);
|
||||
void dbCaLinkInit(int pass);
|
||||
long dbFastLinkGet(struct link *plink, struct dbCommon *precord, void *pdest);
|
||||
long dbFastLinkPut(struct link *plink, struct dbCommon *precord, void *psource);
|
||||
long cvt_uninit(void *from, void *to, struct dbAddr *paddr);
|
||||
long cvt_dummy(void *from, void *to, struct dbAddr *paddr);
|
||||
long dbScanLink(struct dbCommon *pfrom, struct dbCommon *pto);
|
||||
#else
|
||||
void dbScanLock();
|
||||
void dbScanUnlock();
|
||||
void dbScanLockInit();
|
||||
long dbScanPassive();
|
||||
long dbProcess();
|
||||
long dbNameToAddr();
|
||||
long dbGetLink();
|
||||
long dbPutField();
|
||||
long dbPut();
|
||||
long dbGetField();
|
||||
long dbPutLink();
|
||||
long dbBufferSize();
|
||||
long dbValueSize();
|
||||
long dbCaAddInlink();
|
||||
long dbCaAddOutlink();
|
||||
long dbCaPutLink();
|
||||
long dbCaGetLink();
|
||||
long dbFastLinkGet();
|
||||
long dbFastLinkPut();
|
||||
long cvt_uninit();
|
||||
long cvt_dummy();
|
||||
long dbScanLink();
|
||||
|
||||
#endif /*__STDC__*/
|
||||
|
||||
#endif /*INCdbAccessh*/
|
||||
@@ -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>
|
||||
|
||||
|
||||
105
src/db/dbBkpt.h
Normal file
105
src/db/dbBkpt.h
Normal file
@@ -0,0 +1,105 @@
|
||||
/* dbBkpt.h */
|
||||
/* base/include $Id$ */
|
||||
/*
|
||||
* Author: Matthew Needes
|
||||
* Date: 8-30-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:
|
||||
* -----------------
|
||||
*/
|
||||
|
||||
#ifndef INCdbBkptsh
|
||||
#define INCdbBkptsh 1
|
||||
|
||||
/* Needs to be put into dbTest.h ! */
|
||||
long dbpr(char *name, int level);
|
||||
|
||||
/*
|
||||
* Structure containing a list of set breakpoints
|
||||
* in a lockset
|
||||
*/
|
||||
|
||||
struct BP_LIST {
|
||||
NODE *next_list;
|
||||
NODE *prev_list;
|
||||
struct dbCommon *precord;
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure containing queue of entrypoints
|
||||
* detected for a lockset.
|
||||
*/
|
||||
struct EP_LIST {
|
||||
NODE *next_list;
|
||||
NODE *prev_list;
|
||||
struct dbCommon *entrypoint; /* pointer to entry point in lockset */
|
||||
unsigned long count; /* number of times record processed */
|
||||
unsigned long time; /* time record first logged */
|
||||
char sched; /* schedule record for next dbContTask() pass */
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure for stack of lock sets that
|
||||
* currently contain breakpoints. (uses lstLib)
|
||||
*/
|
||||
struct LS_LIST {
|
||||
NODE *next_list;
|
||||
NODE *prev_list;
|
||||
struct dbCommon *precord;/* points to where execution is currently stopped */
|
||||
struct dbCommon *current_ep; /* current entrypoint */
|
||||
LIST bp_list; /* list of records containing breakpoints in a lockset */
|
||||
LIST ep_queue; /* queue of entrypoints found so far */
|
||||
SEM_ID ex_sem; /* semaphore for execution queue */
|
||||
int taskid; /* saved taskid for the task in stepping mode */
|
||||
int step; /* one if currently "stepping," else zero */
|
||||
short l_num; /* lockset number */
|
||||
};
|
||||
|
||||
/* Values for BKPT (breakpoint) field in record */
|
||||
|
||||
/* 1st bit = 0 if breakpoint is not set, */
|
||||
/* 1 if breakpoint set */
|
||||
/* 2nd bit = 0 if no printing after processing */
|
||||
/* 1 if print after processing set */
|
||||
|
||||
/* Breakpoint Masks */
|
||||
#define BKPT_ON_MASK 0x001
|
||||
#define BKPT_OFF_MASK 0x0FE
|
||||
#define BKPT_PRINT_MASK 0x002
|
||||
#define BKPT_PRINT_OFF_MASK 0x0FD
|
||||
|
||||
#define MAX_EP_COUNT 99999
|
||||
|
||||
long dbb();
|
||||
long dbd();
|
||||
long dbc();
|
||||
long dbs();
|
||||
long dbstat();
|
||||
long dbtap();
|
||||
int dbBkpt();
|
||||
void dbPrint();
|
||||
|
||||
extern long lset_stack_not_empty;
|
||||
|
||||
#endif
|
||||
@@ -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 */
|
||||
|
||||
@@ -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.db
Normal file
246
src/db/dbCommon.db
Normal 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)
|
||||
}
|
||||
3
src/db/dbCommonRecord.db
Normal file
3
src/db/dbCommonRecord.db
Normal file
@@ -0,0 +1,3 @@
|
||||
recordtype(dbCommon) {
|
||||
include "dbCommon.db"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
39
src/db/dbConvert.h
Normal file
39
src/db/dbConvert.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/* dbConvert.h */
|
||||
/*
|
||||
* Author: Marty Kraimer
|
||||
* Date: 13OCT95
|
||||
*
|
||||
* 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 13OCT95 mrk Created header file as part of extracting convert from
|
||||
* dbLink
|
||||
*/
|
||||
|
||||
#include <dbFldTypes.h>
|
||||
extern long (*dbGetConvertRoutine[DBF_DEVICE+1][DBR_ENUM+1])
|
||||
(DBADDR *paddr, void *pbuffer,long nRequest, long no_elements, long offset);
|
||||
extern long (*dbPutConvertRoutine[DBR_ENUM+1][DBF_DEVICE+1])
|
||||
(DBADDR *paddr, void *pbuffer,long nRequest, long no_elements, long offset);
|
||||
extern long (*dbFastGetConvertRoutine[DBF_DEVICE+1][DBR_ENUM+1])();
|
||||
extern long (*dbFastPutConvertRoutine[DBR_ENUM+1][DBF_DEVICE+1])();
|
||||
@@ -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 */
|
||||
|
||||
|
||||
173
src/db/dbEvent.h
Normal file
173
src/db/dbEvent.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/* $Id$
|
||||
*
|
||||
* Author: Jeff Hill
|
||||
* Date: 030393
|
||||
*
|
||||
* 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 021494 joh updated ANSI func proto and added extra labor
|
||||
* call back
|
||||
*/
|
||||
|
||||
#ifndef INCLdbEventh
|
||||
#define INCLdbEventh
|
||||
|
||||
/*
|
||||
* collides with db_access.h used in the CA client
|
||||
*/
|
||||
#ifndef caClient
|
||||
#include <dbCommon.h>
|
||||
#endif /*caClient*/
|
||||
|
||||
#include <db_field_log.h>
|
||||
|
||||
struct event_block{
|
||||
ELLNODE node;
|
||||
struct db_addr *paddr;
|
||||
void (*user_sub)(
|
||||
void *user_arg,
|
||||
struct db_addr *paddr,
|
||||
int eventsRemaining,
|
||||
db_field_log *pfl);
|
||||
void *user_arg;
|
||||
struct event_que *ev_que;
|
||||
unsigned char select;
|
||||
char valque;
|
||||
unsigned long npend; /* n times this event is on the que */
|
||||
};
|
||||
|
||||
typedef void EVENTFUNC(
|
||||
void *user_arg,
|
||||
struct db_addr *paddr,
|
||||
int eventsRemaining,
|
||||
db_field_log *pfl);
|
||||
|
||||
|
||||
#define EVENTQUESIZE EVENTENTRIES *32
|
||||
#define EVENTENTRIES 16 /* the number of que entries for each event */
|
||||
#define EVENTQEMPTY ((struct event_block *)NULL)
|
||||
|
||||
|
||||
/*
|
||||
* really a ring buffer
|
||||
*/
|
||||
struct event_que{
|
||||
struct event_block *evque[EVENTQUESIZE];
|
||||
db_field_log valque[EVENTQUESIZE];
|
||||
unsigned short putix;
|
||||
unsigned short getix;
|
||||
unsigned short quota; /* the number of assigned entries*/
|
||||
|
||||
/* lock writers to the ring buffer only */
|
||||
/* readers must never slow up writers */
|
||||
FAST_LOCK writelock;
|
||||
|
||||
struct event_que *nextque; /* in case que quota exceeded */
|
||||
struct event_user *evuser; /* event user parent struct */
|
||||
};
|
||||
|
||||
struct event_user{
|
||||
int taskid; /* event handler task id */
|
||||
|
||||
char pendlck; /* Only one task can pend */
|
||||
SEM_ID ppendsem; /* Wait while empty */
|
||||
SEM_ID pflush_sem; /* wait for flush */
|
||||
unsigned char pendexit; /* exit pend task */
|
||||
unsigned char extra_labor; /* if set call extra labor func */
|
||||
|
||||
unsigned short queovr; /* event que overflow count */
|
||||
void (*overflow_sub)(/* called when overflow detect */
|
||||
void *overflow_arg, unsigned count);
|
||||
void *overflow_arg; /* parameter to above */
|
||||
|
||||
void (*extralabor_sub)/* off load to event task */
|
||||
(void *extralabor_arg);
|
||||
void *extralabor_arg;/* parameter to above */
|
||||
|
||||
struct event_que firstque; /* the first event que */
|
||||
};
|
||||
|
||||
typedef void OVRFFUNC(void *overflow_arg, unsigned count);
|
||||
typedef void EXTRALABORFUNC(void *extralabor_arg);
|
||||
|
||||
int db_event_list(char *name);
|
||||
struct event_user *db_init_events(void);
|
||||
int db_close_events(struct event_user *evuser);
|
||||
unsigned db_sizeof_event_block(void);
|
||||
|
||||
int db_add_event(
|
||||
struct event_user *evuser,
|
||||
struct db_addr *paddr,
|
||||
EVENTFUNC *user_sub,
|
||||
void *user_arg,
|
||||
unsigned int select,
|
||||
struct event_block *pevent /* ptr to event blk (not required) */
|
||||
);
|
||||
|
||||
int db_cancel_event(struct event_block *pevent);
|
||||
|
||||
int db_add_overflow_event(
|
||||
struct event_user *evuser,
|
||||
OVRFFUNC *overflow_sub,
|
||||
void *overflow_arg
|
||||
);
|
||||
|
||||
int db_add_extra_labor_event(
|
||||
struct event_user *evuser,
|
||||
EXTRALABORFUNC *func,
|
||||
void *arg);
|
||||
|
||||
int db_flush_extra_labor_event(
|
||||
struct event_user *evuser
|
||||
);
|
||||
|
||||
int db_post_single_event(struct event_block *pevent);
|
||||
|
||||
int db_post_extra_labor(struct event_user *evuser);
|
||||
|
||||
int db_post_events(
|
||||
void *precord,
|
||||
void *pvalue,
|
||||
unsigned int select
|
||||
);
|
||||
|
||||
int db_start_events(
|
||||
struct event_user *evuser,
|
||||
char *taskname, /* defaulted if NULL */
|
||||
void (*init_func)(int),
|
||||
int init_func_arg,
|
||||
int priority_offset
|
||||
);
|
||||
|
||||
int event_task(
|
||||
struct event_user *evuser,
|
||||
void (*init_func)(int),
|
||||
int init_func_arg
|
||||
);
|
||||
|
||||
int db_event_enable(struct event_block *pevent);
|
||||
int db_event_disable(struct event_block *pevent);
|
||||
|
||||
#endif /*INCLdbEventh*/
|
||||
|
||||
@@ -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} };
|
||||
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#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 {
|
||||
@@ -140,7 +141,7 @@ static long putNotify(PUTNOTIFY *ppn)
|
||||
void *pbuffer = ppn->pbuffer;
|
||||
long nRequest = ppn->nRequest;
|
||||
long status=0;
|
||||
struct fldDes *pfldDes=(struct fldDes *)(paddr->pfldDes);
|
||||
dbFldDes *pfldDes=(dbFldDes *)(paddr->pfldDes);
|
||||
struct dbCommon *precord = (struct dbCommon *)(paddr->precord);
|
||||
|
||||
if(precord->ppn == ppn) {
|
||||
|
||||
140
src/db/dbScan.c
140
src/db/dbScan.c
@@ -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,21 +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 struct dbBase *pdbbase;
|
||||
|
||||
/* SCAN ONCE */
|
||||
#define ONCE_QUEUE_SIZE 256
|
||||
@@ -155,7 +159,8 @@ 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)) {
|
||||
if(rngBufPut(eventQ,(void *)&evnt,sizeof(unsigned char))
|
||||
!=sizeof(unsigned char)) {
|
||||
if(newOverflow) errMessage(0,"rngBufPut overflow in post_event");
|
||||
newOverflow = FALSE;
|
||||
} else {
|
||||
@@ -174,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;
|
||||
}
|
||||
@@ -198,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;
|
||||
}
|
||||
@@ -213,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;
|
||||
}
|
||||
@@ -244,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) {
|
||||
@@ -264,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*/
|
||||
@@ -442,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++) {
|
||||
@@ -497,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;
|
||||
}
|
||||
}
|
||||
@@ -674,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
70
src/db/dbScan.h
Normal file
70
src/db/dbScan.h
Normal file
@@ -0,0 +1,70 @@
|
||||
/* $Id$
|
||||
*
|
||||
* Author: Marty Kraimer
|
||||
* Date: 07-17-91
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 mm-dd-yy mrk Initial version
|
||||
*/
|
||||
|
||||
#ifndef INCdbScanh
|
||||
#define INCdbScanh 1
|
||||
#include <ellLib.h>
|
||||
#include <dbAccess.h>
|
||||
#include <callback.h>
|
||||
/* Note that these must match the first three definitions in choiceGbl.ascii*/
|
||||
#define SCAN_PASSIVE 0
|
||||
#define SCAN_EVENT 1
|
||||
#define SCAN_IO_EVENT 2
|
||||
#define SCAN_1ST_PERIODIC 3
|
||||
|
||||
/*definitions for SCAN_IO_EVENT */
|
||||
typedef void * IOSCANPVT;
|
||||
extern volatile int interruptAccept;
|
||||
|
||||
#ifdef __STDC__
|
||||
long scanInit(void);
|
||||
void post_event(int event);
|
||||
void scanAdd(struct dbCommon *);
|
||||
void scanDelete(struct dbCommon *);
|
||||
void scanOnce(void *precord);
|
||||
int scanppl(void); /*print periodic lists*/
|
||||
int scanpel(void); /*print event lists*/
|
||||
int scanpiol(void); /*print io_event list*/
|
||||
void scanIoInit(IOSCANPVT *);
|
||||
void scanIoRequest(IOSCANPVT);
|
||||
|
||||
#else
|
||||
long scanInit();
|
||||
void post_event();
|
||||
void scanAdd();
|
||||
void scanDelete();
|
||||
void scanppl();
|
||||
void scanpel();
|
||||
void scanpiol();
|
||||
void scanIoInit();
|
||||
void scanIoRequest();
|
||||
#endif /*__STDC__*/
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user