Compare commits
251 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
89a6d17353 | ||
|
|
d9666a8f30 | ||
|
|
7cb76ae9e4 | ||
|
|
46e00da251 | ||
|
|
39d98562fc | ||
|
|
8624be05d4 | ||
|
|
c0da182217 | ||
|
|
6dab97f8e7 | ||
|
|
1abcc71e71 | ||
|
|
f8f17eeb33 | ||
|
|
db50e1bdd7 | ||
|
|
96605d4439 | ||
|
|
593bc413bf | ||
|
|
3e20abece8 | ||
|
|
79c01170e8 | ||
|
|
6c21758d23 | ||
|
|
d2347c497c | ||
|
|
099f63fb20 | ||
|
|
665a5134d3 | ||
|
|
e1b04e69bb | ||
|
|
8375a2cf18 | ||
|
|
300f38584b | ||
|
|
b9a5acc88c | ||
|
|
2ff81c09f0 | ||
|
|
63eefd2ba8 | ||
|
|
f9f8e55035 | ||
|
|
0f8f36c4bb | ||
|
|
fd6e666256 | ||
|
|
d492d665fc | ||
|
|
6b659e8404 | ||
|
|
43ecde53f3 | ||
|
|
e6ffa71c54 | ||
|
|
be6ecdfe24 | ||
|
|
e6bec6af38 | ||
|
|
59a2f10867 | ||
|
|
00abe6b876 | ||
|
|
b0e9cc9fba | ||
|
|
6eb04984bd | ||
|
|
d9a05d6051 | ||
|
|
d9233e4864 | ||
|
|
34bd710ffa | ||
|
|
438f00a708 | ||
|
|
622a225308 | ||
|
|
1c14ac4941 | ||
|
|
df2ce01069 | ||
|
|
f7aa394524 | ||
|
|
ed6047ec51 | ||
|
|
a3573cd384 | ||
|
|
81deb4fceb | ||
|
|
b7378bbc62 | ||
|
|
bdffdb0369 | ||
|
|
98809f8141 | ||
|
|
8a0f66cb9b | ||
|
|
0462aed01d | ||
|
|
ea279855da | ||
|
|
66210afed7 | ||
|
|
c13d342680 | ||
|
|
549a4ba978 | ||
|
|
cf7fe3deb4 | ||
|
|
ef8abaa44f | ||
|
|
5624aaefe1 | ||
|
|
2b7e4ff84d | ||
|
|
fb2c2f0925 | ||
|
|
55dae7db1c | ||
|
|
524da0d2df | ||
|
|
93c191ffe9 | ||
|
|
0dc2be41d3 | ||
|
|
11af4456c7 | ||
|
|
f232999d32 | ||
|
|
ca13bfdff9 | ||
|
|
21cbea930a | ||
|
|
8b06e22907 | ||
|
|
f3dcfd60bb | ||
|
|
1b33e449c6 | ||
|
|
afa208a5e1 | ||
|
|
5903ff0cdb | ||
|
|
51d44c6200 | ||
|
|
a362731044 | ||
|
|
0e225a4335 | ||
|
|
8c0527c25a | ||
|
|
92f91ee2cc | ||
|
|
1bd52dfef9 | ||
|
|
c7005b4783 | ||
|
|
d9e3f09760 | ||
|
|
07a265d299 | ||
|
|
feb73d85b3 | ||
|
|
f18238a8b9 | ||
|
|
8ff5572e6c | ||
|
|
865e69d7d3 | ||
|
|
38f82f342d | ||
|
|
20fd27263a | ||
|
|
7760d16956 | ||
|
|
3fab82780b | ||
|
|
fd679234dd | ||
|
|
7f949f441b | ||
|
|
48640936f5 | ||
|
|
1e2d258c66 | ||
|
|
83d4ee2313 | ||
|
|
67324dc7b7 | ||
|
|
47843d49a0 | ||
|
|
d27f70a883 | ||
|
|
bcde03d0a0 | ||
|
|
1887fbd7f8 | ||
|
|
f3e0f33d15 | ||
|
|
09e1c40650 | ||
|
|
0de34c3162 |
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).
|
||||
140
MakeRelease
Executable file
140
MakeRelease
Executable file
@@ -0,0 +1,140 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Make Release - Creates an EPICS release
|
||||
# By Matthew Needes and Bob Zieman
|
||||
#
|
||||
# MakeRelease [-b]
|
||||
#
|
||||
# [-b] - For fully built release
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.2 1995/08/28 15:49:54 jba
|
||||
# Added startup directory to release tar file
|
||||
#
|
||||
# Revision 1.1 1995/08/17 20:14:56 jba
|
||||
# Added base/tools scripts functionality to base/Makefile, removed scripts
|
||||
# Moved base/tools/MakeRelease to base dir.
|
||||
#
|
||||
# Revision 1.14 1994/12/19 18:42:08 tang
|
||||
# Make the args length compatible for HP and SUN.
|
||||
#
|
||||
# Revision 1.13 1994/12/15 19:19:18 tang
|
||||
# Replace -I opt by cat and xargs for tar for HP compatibility.
|
||||
#
|
||||
# Revision 1.12 1994/12/14 23:57:55 tang
|
||||
# Take out \< and \> pair for hp compatible
|
||||
#
|
||||
# Revision 1.11 1994/10/31 21:44:17 jba
|
||||
# Moved print stmnt, added cd $(EPICS)
|
||||
#
|
||||
# Revision 1.10 1994/10/05 18:29:34 jba
|
||||
# Renamed version.h to epicsVersion.h
|
||||
#
|
||||
# Revision 1.9 1994/09/22 01:41:47 mcn
|
||||
# MakeRelease - MAJOR bug fix. GetVar / MakeDirs - minor fix.
|
||||
#
|
||||
# Revision 1.8 1994/09/07 20:59:15 mcn
|
||||
# Revamped GetVar, modified scripts for new GetVar.
|
||||
#
|
||||
# Revision 1.7 1994/09/02 20:58:00 mcn
|
||||
# minor change.
|
||||
#
|
||||
# Revision 1.6 1994/08/21 00:56:41 mcn
|
||||
# New Stuff
|
||||
#
|
||||
# Revision 1.5 1994/08/02 18:36:29 mcn
|
||||
# Support new configuration.
|
||||
#
|
||||
# Revision 1.4 1994/07/14 22:13:32 mcn
|
||||
# Now include SDR Makefile/Headers
|
||||
#
|
||||
#
|
||||
|
||||
EPICS=${1};
|
||||
|
||||
if [ ! -d include -o ! -d src ]; then
|
||||
echo "Cannot find src or include, are you at the top of EPICS base ?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd $EPICS/base
|
||||
|
||||
FULLY_BUILT=NO
|
||||
if [ "${2}" = "-b" ]; then
|
||||
FULLY_BUILT=YES
|
||||
shift
|
||||
fi
|
||||
|
||||
# Retrieve EPICS release string from include/epicsVersion.h
|
||||
grep EPICS_VERSION_STRING include/epicsVersion.h > /dev/null 2>&1 || ERR=1;
|
||||
|
||||
if [ "$ERR" = "1" ];
|
||||
then
|
||||
echo "TOP: Cannot retrieve release number from include/epicsVersion.h";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
RELS=`grep "EPICS_VERSION_STRING" include/epicsVersion.h \
|
||||
| sed -e 's-.*Version--' \
|
||||
-e 's-[ ][ ]*--g' \
|
||||
-e 's-".*--' \
|
||||
-e 's-\.0$--'`;
|
||||
|
||||
if [ -z "${RELS}" ];
|
||||
then
|
||||
echo "TOP: Cannot retrieve release number from include/epicsVersion.h";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
RELS="R${RELS}";
|
||||
|
||||
echo TOP: Creating ../${RELS}.Tar;
|
||||
|
||||
if [ -f ${RELS}.Tar* ];
|
||||
then
|
||||
echo "TOP: This release has already been created.";
|
||||
echo "TOP: Remove Tar file or edit include/epicsVersion.h.";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Create list of files and dirs to include in Tar file
|
||||
|
||||
cd $EPICS
|
||||
|
||||
ls base/README* | xargs tar cvf ${RELS}.Tar
|
||||
|
||||
ls base/Makefile* > /tmp/make_release.out.$$;
|
||||
|
||||
ls base/*COPYRIGHT* >> /tmp/make_release.out.$$;
|
||||
|
||||
if [ -d startup ];
|
||||
then
|
||||
find startup -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
fi
|
||||
|
||||
find config base/include base/man base/tools -name CVS -prune -o \
|
||||
! -type d -print >> /tmp/make_release.out.$$;
|
||||
|
||||
# binary / library / default.dctsdr / <rec>Record.h / etc.
|
||||
if [ $FULLY_BUILT = "YES" ];
|
||||
then
|
||||
find base/bin -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
|
||||
find base/lib -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
|
||||
find base/rec -name CVS -prune -o ! -type d -print \
|
||||
>> /tmp/make_release.out.$$;
|
||||
fi
|
||||
|
||||
find base/src -name CVS -prune -o -name SCCS -prune -o ! -type d -print \
|
||||
| grep -v '/O\..*$' >> /tmp/make_release.out.$$
|
||||
|
||||
cat /tmp/make_release.out.$$ | xargs tar rvf ${RELS}.Tar
|
||||
|
||||
rm /tmp/make_release.out.$$
|
||||
|
||||
49
Makefile
49
Makefile
@@ -12,6 +12,9 @@
|
||||
# install because the release.% syntax is illegal.
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.23 1995/02/13 15:00:09 jba
|
||||
# Changed include file from CONFIG_SITE to CONFIG
|
||||
#
|
||||
# Revision 1.22 1994/11/14 23:12:17 tang
|
||||
# Replace ARCH_TYPE with .
|
||||
#
|
||||
@@ -74,21 +77,27 @@ depends:
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
|
||||
clean:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
|
||||
uninstall:
|
||||
@(for ARCH in ${BUILD_ARCHS}; \
|
||||
do \
|
||||
ARCH_TYPE=$$ARCH \
|
||||
${MAKE} ${MFLAGS} $@.$$ARCH; \
|
||||
done)
|
||||
|
||||
release:
|
||||
@echo TOP: Creating Release...
|
||||
@tools/MakeRelease
|
||||
@./MakeRelease ${EPICS}
|
||||
|
||||
built_release: install
|
||||
@echo TOP: Creating Fully Built Release...
|
||||
@tools/MakeRelease -b
|
||||
|
||||
clean:
|
||||
@echo "TOP: Cleaning"
|
||||
@tools/Clean
|
||||
|
||||
uninstall:
|
||||
rm -rf bin/* lib/* rec.bak
|
||||
rm -f rec/default.dctsdr rec/default.sdrSum rec/*.h
|
||||
@./MakeRelease ${EPICS} -b
|
||||
|
||||
# Notes for single architecture build rules:
|
||||
# CheckArch only has to be run for dirs.% . That
|
||||
@@ -107,20 +116,15 @@ uninstall:
|
||||
# some things may be included on a per architecture
|
||||
# basis.
|
||||
|
||||
dirs.%:
|
||||
@tools/CheckArch $*
|
||||
@echo $*: Creating Directories
|
||||
@tools/MakeDirs $*
|
||||
|
||||
build.%: dirs.%
|
||||
build.%:
|
||||
@echo $*: Building
|
||||
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs build
|
||||
|
||||
install.%: dirs.%
|
||||
install.%:
|
||||
@echo $*: Installing
|
||||
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs install
|
||||
|
||||
depends.%: dirs.%
|
||||
depends.%:
|
||||
@echo $*: Performing Make Depends
|
||||
@${MAKE} ${MFLAGS} T_A=$* -f Makefile.subdirs depends
|
||||
|
||||
@@ -133,11 +137,10 @@ release.%:
|
||||
@echo
|
||||
|
||||
uninstall.%:
|
||||
@echo
|
||||
@echo "The uninstall.arch syntax is not supported by this build."
|
||||
@echo
|
||||
@echo "TOP: Uninstalling $* "
|
||||
@rm -rf ./bin/$* ./lib/$* rec.bak rec
|
||||
|
||||
clean.%:
|
||||
@echo "$*: Cleaning"
|
||||
@tools/Clean $*
|
||||
@echo "TOP: Cleaning $* "
|
||||
@find src -type d -name "O.$*" -prune -exec rm -rf {} \;
|
||||
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
# by Matthew Needes and Mike Bordua
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.13 1994/09/09 17:32:29 jba
|
||||
# Cleanup of files
|
||||
#
|
||||
# Revision 1.12 1994/09/08 17:25:41 mcn
|
||||
# Changed clean to tools/Clean. Added "uninstall" dependency.
|
||||
#
|
||||
@@ -27,7 +30,7 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
all: build
|
||||
|
||||
build:
|
||||
build: dirs
|
||||
@(for DIR in ${DIRS}; \
|
||||
do \
|
||||
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
|
||||
@@ -35,7 +38,7 @@ build:
|
||||
cd $$TMP; \
|
||||
done)
|
||||
|
||||
install:
|
||||
install: dirs
|
||||
@(for DIR in ${DIRS}; \
|
||||
do \
|
||||
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
|
||||
@@ -43,7 +46,7 @@ install:
|
||||
cd $$TMP; \
|
||||
done)
|
||||
|
||||
depends:
|
||||
depends: dirs
|
||||
@(for DIR in ${DIRS}; \
|
||||
do \
|
||||
TMP=`pwd`; echo "${T_A}: $@: $$DIR"; \
|
||||
@@ -51,3 +54,23 @@ depends:
|
||||
cd $$TMP; \
|
||||
done)
|
||||
|
||||
dirs:
|
||||
@echo ${T_A}: Creating Directories
|
||||
@for DIR in ${DIRS}; \
|
||||
do \
|
||||
TMP=`pwd`; \
|
||||
cd $$DIR ; \
|
||||
if [ -f Makefile.${BUILD_TYPE} ] ; then \
|
||||
test -d O.${T_A} || \
|
||||
mkdir O.${T_A}; \
|
||||
test -f O.${T_A}/Makefile || \
|
||||
ln -s ../Makefile.${BUILD_TYPE} O.${T_A}/Makefile \
|
||||
> /dev/null 2> /dev/null; \
|
||||
test -f O.${T_A}/Target.include || \
|
||||
echo "T_A=${T_A}" > O.${T_A}/Target.include; \
|
||||
test -f O.${T_A}/.DEPENDS || \
|
||||
touch O.${T_A}/.DEPENDS; \
|
||||
fi ; \
|
||||
cd $$TMP; \
|
||||
done
|
||||
|
||||
|
||||
74
README
74
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 (as make) before any system supplied makes.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Part 1 - Configuring and Building EPICS Base
|
||||
@@ -39,63 +29,63 @@ gmake
|
||||
|
||||
cd epics/config
|
||||
cp CONFIG_ARCH.mv167 CONFIG_ARCH.YOUR_ARCH
|
||||
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
|
||||
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
|
||||
|
||||
cp CONFIG.Vx.68k CONFIG.Vx.YOUR_ARCH_CLASS
|
||||
cp CONFIG_SITE.Vx.68k CONFIG_SITE.Vx.YOUR_ARCH_CLASS
|
||||
- ONLY IF you are adding a new architecture class,
|
||||
see note in Appendix A.
|
||||
|
||||
edit CONFIG_BASE - Add architecture to list.
|
||||
edit CONFIG_BASE - Add architecture to list.
|
||||
|
||||
1.3 To build EPICS:
|
||||
|
||||
cd epics/base
|
||||
gmake - To build and install EPICS.
|
||||
gmake clean - To clean temporary object files. Clean will
|
||||
gnumake - To build and install EPICS.
|
||||
gnumake clean - To clean temporary object files. Clean will
|
||||
remove files from ALL O.ARCH dirs, not
|
||||
only those specified in BUILD_ARCHS.
|
||||
|
||||
1.4 To create an EPICS release:
|
||||
|
||||
edit base/include/version.h - ONLY IF you need to change the EPICS
|
||||
version number.
|
||||
edit base/include/version.h - ONLY IF you need to change the EPICS
|
||||
version number.
|
||||
|
||||
gmake release - Will create Tar file
|
||||
gnumake release - Will create Tar file
|
||||
|
||||
gmake built_release - Will create Tar file, after generating
|
||||
dependencies, INCLUDING BINARIES.
|
||||
gnumake built_release - Will create Tar file, after generating
|
||||
dependencies, INCLUDING BINARIES.
|
||||
|
||||
1.5 "Partial" build commands:
|
||||
|
||||
gmake clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
|
||||
gmake install.sun4 - Builds sun4 only.
|
||||
gmake install.mv167 - Builds mv167 only (a HOST_ARCH build must
|
||||
be complete before this can be issued).
|
||||
gnumake clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
|
||||
gnumake install.sun4 - Builds sun4 only.
|
||||
gnumake install.mv167 - Builds mv167 only (a HOST_ARCH build must
|
||||
be complete before this can be issued).
|
||||
|
||||
NOTES:
|
||||
1. tools/MakeRelease will create tar files in the directory ABOVE
|
||||
base. These tar files are then meant to be untarred at that level.
|
||||
This release will include the "epics/config" directory.
|
||||
1. base/MakeRelease will create tar files in the directory ABOVE
|
||||
base. These tar files are then meant to be untarred at that level.
|
||||
This release will include the "epics/config" directory.
|
||||
|
||||
2. EPICS binaries are kept in the bin/ARCH and lib/ARCH directories.
|
||||
EPICS shellscripts are kept in the tools directory.
|
||||
EPICS shellscripts are kept in the tools directory.
|
||||
|
||||
3. During a normal build (a "make" or "make install"), the "depends"
|
||||
dependency will NOT be invoked. Only if "make depends" is run
|
||||
explicitly, or a "make built_release" is performed will dependencies
|
||||
be generated automatically.
|
||||
dependency will NOT be invoked. Only if "make depends" is run
|
||||
explicitly, or a "make built_release" is performed will dependencies
|
||||
be generated automatically.
|
||||
|
||||
4. Temporary objects are stored in src/DIR/O.ARCH, This allows objects
|
||||
for multiple architectures to be maintained at the same time.
|
||||
While developing source for EPICS, merely cd src/DIR/O.ARCH, and
|
||||
invoke "make":
|
||||
for multiple architectures to be maintained at the same time.
|
||||
While developing source for EPICS, merely cd src/DIR/O.ARCH, and
|
||||
invoke "make":
|
||||
|
||||
cd epics/base/src/db/O.mv167
|
||||
make dbAccess.o
|
||||
cd epics/base/src/db/O.mv167
|
||||
make dbAccess.o
|
||||
|
||||
The above example instructs make to build dbAccess.o for the
|
||||
mv167 target.
|
||||
The above example instructs make to build dbAccess.o for the
|
||||
mv167 target.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Part 2 --- Configuration Files in epics/config
|
||||
|
||||
34
README.Linux
Normal file
34
README.Linux
Normal file
@@ -0,0 +1,34 @@
|
||||
Special Notes on Linux
|
||||
1) The epics makefiles use GNU make which is the make that comes
|
||||
with Linux. You need to make a link from make to gnumake and
|
||||
have it in your path. After you have defined the EPICS environement
|
||||
variable, you can use:
|
||||
|
||||
ln -s /usr/bin/make $EPICS/base/tools/gnumake
|
||||
|
||||
2) At this point, support for Linux only involves channel access
|
||||
clients. Since Vxworks is not available for Linux, you must
|
||||
use other platforms for developing server side code. As for
|
||||
building databases with dct and gdct, this requires that the
|
||||
$EPICS/base/tools/makesdr script works properly. Since makesdr
|
||||
is slated to be removed from the EPICS distribution in a future
|
||||
release, we didn't feel it was important to include this capability
|
||||
now. Consequently, when you run make you will receive the error
|
||||
|
||||
gnumake[4]: *** [bldDefaultSdr] Error 127
|
||||
|
||||
and
|
||||
|
||||
gnumake[3]: *** [comsubs.o] Error 1
|
||||
|
||||
3) You MUST start caRepeater by hand before running a client.
|
||||
Prior to running a client, you must run:
|
||||
|
||||
caRepeater &
|
||||
|
||||
---
|
||||
jpq@nwu.edu
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -4,42 +4,11 @@
|
||||
# M. Anderson and J. Tang
|
||||
|
||||
|
||||
- EPICS environment variable - set by hand prior to build
|
||||
|
||||
For EPICS builds on HP700 and Alpha OSF/1, set an environment variable "EPICS"
|
||||
to the base of the EPICS directory to do builds in (the directory where
|
||||
this file resides, for instance).
|
||||
|
||||
If you are currently in the base directory, then do the following:
|
||||
% setenv EPICS $cwd
|
||||
|
||||
|
||||
- set path to include gnu make and base/tools and base/bin/<arch>
|
||||
|
||||
Then set the path such that a recent version (e.g. V3.70) of gnumake
|
||||
is available (as make) before any system supplied makes, and that
|
||||
$EPICS/base/tools and $EPICS/base/bin/<arch> are included as well.
|
||||
|
||||
For example:
|
||||
|
||||
% set path=(/usr/local/bin $EPICS/base/tools $EPICS/base/bin/hp700 $path)
|
||||
|
||||
|
||||
- to build multiple architectures in same tree
|
||||
|
||||
To build multiple architectures in the same directory tree, you
|
||||
can avoid editing CONFIG_SITE by simply issuing make with HOST_ARCH=<arch>
|
||||
|
||||
For example:
|
||||
|
||||
% make HOST_ARCH=hp700
|
||||
|
||||
|
||||
Also, directory permissions may not be correct across multiple machines,
|
||||
so a
|
||||
- Directory permissions may not be correct across multiple machines, so a
|
||||
|
||||
% chmod -R ugo+rw base extensions
|
||||
|
||||
might be necessary.
|
||||
|
||||
- bsdinstall is written to replace install for hp.
|
||||
- epics/base/tools/bsdinstall was written to replace install for hp.
|
||||
|
||||
|
||||
@@ -1,29 +1,21 @@
|
||||
----------------------------------------------------------------------------
|
||||
EPICS R3.12 Notes for Solaris 2.3
|
||||
EPICS R3.12.2 Notes for Solaris
|
||||
- By Andrew Johnson
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Notes:
|
||||
|
||||
1. In order to build and use EPICS under Solaris 2, you must include
|
||||
various directories in your path in the order given below, in addition
|
||||
to those named in base/README. Some of these directories may already be
|
||||
included in your path from your .login script or .cshrc file, so be
|
||||
careful that the ordering is correct.
|
||||
1. In order to build EPICS under Solaris 2, you must ensure that the
|
||||
solaris directory /usr/ccs/bin is in your search path.
|
||||
|
||||
setenv PATH /usr/ucb:/usr/bin:/usr/ccs/bin:$PATH
|
||||
2. It is not possible to compile EPICS under Solaris 2 using only the
|
||||
GNU gcc compiler -- you must have the Sun SPARCworks ANSI C compiler.
|
||||
|
||||
2. It is not possible to compile the whole of EPICS under Solaris 2
|
||||
using only the GNU gcc compiler - some routines which are needed (for
|
||||
example quiet_nan()) have been unbundled by Sun and are provided with
|
||||
their ANSI C compiler. The path to the Sun compiler is explicitly set
|
||||
using the SPARCWORKS definition in the file CONFIG_SITE.Unix.solaris
|
||||
|
||||
3. EPICS must be compiled and linked using the UCB compatability
|
||||
libraries. The definitions UCB_LIB and UCB_INCLUDE are used here to
|
||||
refer to these libraries and their header files, and the tools provided
|
||||
within /usr/ucb must be used in preference to the System V ones, hence
|
||||
the above path ordering.
|
||||
3. EPICS under Solaris 2 no longer uses the UCB compatability
|
||||
libraries. It does require the /usr/ucb/install program however. In
|
||||
order to ensure that the /usr/ucblib files are not inherited, you
|
||||
should ensure that your LD_LIBRARY_PATH environment variable does not
|
||||
include /usr/ucblib when you build any of the host tools.
|
||||
|
||||
--
|
||||
anj@mail.ast.cam.ac.uk
|
||||
anj@ast.cam.ac.uk
|
||||
|
||||
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,9 +11,6 @@ DEPLIBS = ./libAs.a\
|
||||
$(DEPLIBS_BASE)/libCom.a\
|
||||
$(DEPLIBS_BASE)/libDb.a
|
||||
|
||||
LEX = $(ELEX)
|
||||
YACC = $(EYACC)
|
||||
|
||||
SRCS.c = ../ascheck.c asLib.c
|
||||
OBJS = ascheck.o
|
||||
LIBOBJS = asLib.o
|
||||
|
||||
@@ -5,8 +5,8 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
|
||||
|
||||
SRCS.c = ../asDbLib.c ../asCa.c asLib.c
|
||||
OBJS = asDbLib.o asCa.o asLib.o
|
||||
PROD = asLibrary
|
||||
LIBOBJS = asDbLib.o asCa.o asLib.o
|
||||
LIBNAME = asLibrary
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
@@ -18,7 +18,4 @@ asLib.o: asLib_lex.c ../asLibRoutines.c
|
||||
clean::
|
||||
@$(RM) asLib_lex.c asLib.c
|
||||
|
||||
asLibrary : $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
|
||||
@@ -58,9 +58,13 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <taskwd.h>
|
||||
#include <alarm.h>
|
||||
#include <caeventmask.h>
|
||||
#include <dbStaticLib.h>
|
||||
#include <dbAccess.h>
|
||||
#include <asLib.h>
|
||||
#include <asDbLib.h>
|
||||
#include <dbCommon.h>
|
||||
@@ -68,7 +72,7 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
#include <subRecord.h>
|
||||
#include <task_params.h>
|
||||
|
||||
extern struct dbBase *pdbBase;
|
||||
extern struct dbBase *pdbbase;
|
||||
static FILE *stream;
|
||||
|
||||
#define BUF_SIZE 100
|
||||
@@ -97,12 +101,12 @@ static int my_yyinput(char *buf, int max_size)
|
||||
|
||||
static long asDbAddRecords(void)
|
||||
{
|
||||
DBENTRY dbentry;
|
||||
DBENTRY *pdbentry=&dbentry;
|
||||
long status;
|
||||
struct dbCommon *precord;
|
||||
DBENTRY dbentry;
|
||||
DBENTRY *pdbentry=&dbentry;
|
||||
long status;
|
||||
dbCommon *precord;
|
||||
|
||||
dbInitEntry(pdbBase,pdbentry);
|
||||
dbInitEntry(pdbbase,pdbentry);
|
||||
status = dbFirstRecdes(pdbentry);
|
||||
while(!status) {
|
||||
status = dbFirstRecord(pdbentry);
|
||||
@@ -148,13 +152,16 @@ static long asInitCommon(void)
|
||||
long status;
|
||||
char buffer[BUF_SIZE];
|
||||
|
||||
if(!pacf) return(0);
|
||||
if(asLockInit) {
|
||||
FASTLOCKINIT(&asLock);
|
||||
asLockInit = FALSE;
|
||||
}
|
||||
FASTLOCK(&asLock);
|
||||
if(asActive)asCaStop();
|
||||
if(!pacf) {
|
||||
asActive = FALSE;
|
||||
return(0);
|
||||
}
|
||||
buffer[0] = 0;
|
||||
my_buffer = buffer;
|
||||
my_buffer_ptr = my_buffer;
|
||||
@@ -232,7 +239,7 @@ int asInitAsyn(ASDBCALLBACK *pcallback)
|
||||
static void myCallback(CALLBACK *pcallback)
|
||||
{
|
||||
ASDBCALLBACK *pasdbcallback = (ASDBCALLBACK *)pcallback;
|
||||
struct subRecord *precord;
|
||||
subRecord *precord;
|
||||
struct rset *prset;
|
||||
|
||||
callbackGetUser(precord,pcallback);
|
||||
@@ -242,12 +249,12 @@ static void myCallback(CALLBACK *pcallback)
|
||||
recGblSetSevr(precord,READ_ALARM,precord->brsv);
|
||||
recGblRecordError(pasdbcallback->status,precord,"asInit Failed");
|
||||
}
|
||||
dbScanLock((struct dbCommon *)precord);
|
||||
(*prset->process)((struct dbCommon *)precord);
|
||||
dbScanUnlock((struct dbCommon *)precord);
|
||||
dbScanLock((dbCommon *)precord);
|
||||
(*prset->process)((dbCommon *)precord);
|
||||
dbScanUnlock((dbCommon *)precord);
|
||||
}
|
||||
|
||||
long asSubInit(struct subRecord *precord,int pass)
|
||||
long asSubInit(subRecord *precord,int pass)
|
||||
{
|
||||
ASDBCALLBACK *pcallback;
|
||||
|
||||
@@ -258,7 +265,7 @@ long asSubInit(struct subRecord *precord,int pass)
|
||||
return(0);
|
||||
}
|
||||
|
||||
long asSubProcess(struct subRecord *precord)
|
||||
long asSubProcess(subRecord *precord)
|
||||
{
|
||||
ASDBCALLBACK *pcallback = (ASDBCALLBACK *)precord->dpvt;
|
||||
|
||||
@@ -275,8 +282,8 @@ long asSubProcess(struct subRecord *precord)
|
||||
|
||||
int asDbGetAsl(void *paddress)
|
||||
{
|
||||
struct dbAddr *paddr = paddress;
|
||||
struct fldDes *pflddes;
|
||||
DBADDR *paddr = paddress;
|
||||
dbFldDes *pflddes;
|
||||
|
||||
pflddes = paddr->pfldDes;
|
||||
return((int)pflddes->as_level);
|
||||
@@ -284,8 +291,8 @@ int asDbGetAsl(void *paddress)
|
||||
|
||||
ASMEMBERPVT asDbGetMemberPvt(void *paddress)
|
||||
{
|
||||
struct dbAddr *paddr = paddress;
|
||||
struct dbCommon *precord;
|
||||
DBADDR *paddr = paddress;
|
||||
dbCommon *precord;
|
||||
|
||||
precord = paddr->precord;
|
||||
return((ASMEMBERPVT)precord->asp);
|
||||
@@ -300,13 +307,13 @@ static void astacCallback(ASCLIENTPVT clientPvt,asClientStatus status)
|
||||
|
||||
int astac(char *pname,char *user,char *location)
|
||||
{
|
||||
struct dbAddr *paddr;
|
||||
long status;
|
||||
ASCLIENTPVT *pasclientpvt=NULL;
|
||||
struct dbCommon *precord;
|
||||
struct fldDes *pflddes;
|
||||
DBADDR *paddr;
|
||||
long status;
|
||||
ASCLIENTPVT *pasclientpvt=NULL;
|
||||
dbCommon *precord;
|
||||
dbFldDes *pflddes;
|
||||
|
||||
paddr = dbCalloc(1,sizeof(struct dbAddr) + sizeof(ASCLIENTPVT));
|
||||
paddr = dbCalloc(1,sizeof(DBADDR) + sizeof(ASCLIENTPVT));
|
||||
pasclientpvt = (ASCLIENTPVT *)(paddr + 1);
|
||||
status=dbNameToAddr(pname,paddr);
|
||||
if(status) {
|
||||
@@ -328,7 +335,7 @@ int astac(char *pname,char *user,char *location)
|
||||
|
||||
static void myMemberCallback(ASMEMBERPVT memPvt)
|
||||
{
|
||||
struct dbCommon *precord;
|
||||
dbCommon *precord;
|
||||
|
||||
precord = asGetMemberPvt(memPvt);
|
||||
if(precord) printf(" Record:%s",precord->name);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
integer [0-9]
|
||||
name [a-zA-Z0-9_\.]
|
||||
pvname [a-zA-Z0-9_:\.\[\]<>;]
|
||||
pvname [a-zA-Z0-9_\-:\.\[\]<>;]
|
||||
string [a-zA-Z0-9_\,\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$]
|
||||
|
||||
%{
|
||||
|
||||
18
src/bdt/Makefile
Normal file
18
src/bdt/Makefile
Normal file
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# Base Lowest Level Directroy Makefile
|
||||
# by Janet Anderson
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.1 1994/09/07 19:26:22 jba
|
||||
# New file
|
||||
#
|
||||
#
|
||||
|
||||
EPICS=../../..
|
||||
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
include $(EPICS)/config/RULES_ARCHS
|
||||
|
||||
10
src/bdt/Makefile.Unix
Normal file
10
src/bdt/Makefile.Unix
Normal file
@@ -0,0 +1,10 @@
|
||||
EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
|
||||
LIBOBJS += bdt.o
|
||||
|
||||
LIBNAME = libBdt.a
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
21
src/bdt/Makefile.Vx
Normal file
21
src/bdt/Makefile.Vx
Normal file
@@ -0,0 +1,21 @@
|
||||
EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
SRCS.c += ../bdt.c
|
||||
SRCS.c += ../bdtServ.c
|
||||
SRCS.c += ../bdtServName.c
|
||||
SRCS.c += ../bdtServPv.c
|
||||
|
||||
OBJS += bdt.o
|
||||
OBJS += bdtServ.o
|
||||
OBJS += bdtServName.o
|
||||
OBJS += bdtServPv.o
|
||||
|
||||
PROD = bdt
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
$(PROD): $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
701
src/bdt/bdt.c
Normal file
701
src/bdt/bdt.c
Normal file
@@ -0,0 +1,701 @@
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#ifdef linux
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#include <in.h>
|
||||
#include <inetLib.h>
|
||||
#include <taskLib.h>
|
||||
#include <ioLib.h>
|
||||
#include <selectLib.h>
|
||||
#else
|
||||
#include <sys/time.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "bdt.h"
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
/* server mode functions */
|
||||
|
||||
#ifndef vxWorks /* server mode functions */
|
||||
static char* filename=(char*)NULL;
|
||||
|
||||
/* ----------------------------- */
|
||||
/* signal catcher for the server */
|
||||
/* ----------------------------- */
|
||||
static void catch_sig(int sig)
|
||||
{
|
||||
fprintf(stderr,"\nbdt server exiting\n");
|
||||
unlink(filename);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* -------------------------------- */
|
||||
/* child reaper for the server mode */
|
||||
/* -------------------------------- */
|
||||
static void get_child(int sig)
|
||||
{
|
||||
while(wait3((int *)NULL,WNOHANG,(struct rusage *)NULL)>0);
|
||||
#ifdef linux
|
||||
signal(SIGCHLD,get_child); /* for reaping children */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ------------------------------- */
|
||||
/* Clear the signals for a process */
|
||||
/* ------------------------------- */
|
||||
int BdtServerClearSignals()
|
||||
{
|
||||
signal(SIGCHLD,SIG_DFL);
|
||||
signal(SIGHUP,SIG_DFL);
|
||||
signal(SIGINT,SIG_DFL);
|
||||
signal(SIGTERM,SIG_DFL);
|
||||
signal(SIGQUIT,SIG_DFL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------- */
|
||||
/* Make a unix process into a generic background process */
|
||||
/* ----------------------------------------------------- */
|
||||
int BdtMakeServer(char** argv)
|
||||
{
|
||||
FILE* fd;
|
||||
|
||||
if(filename) return -1;
|
||||
|
||||
/* set up signal handling for the server */
|
||||
signal(SIGCHLD,get_child); /* for reaping children */
|
||||
signal(SIGHUP,catch_sig);
|
||||
signal(SIGINT,catch_sig);
|
||||
signal(SIGTERM,catch_sig);
|
||||
signal(SIGQUIT,catch_sig);
|
||||
|
||||
/* disconnect from parent */
|
||||
switch(fork())
|
||||
{
|
||||
case -1: /* error */
|
||||
perror("Cannot fork");
|
||||
return -1;
|
||||
case 0: /* child */
|
||||
#ifdef linux
|
||||
setpgrp();
|
||||
#else
|
||||
setpgrp(0,0);
|
||||
#endif
|
||||
setsid();
|
||||
break;
|
||||
default: /* parent goes away */
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* save process ID */
|
||||
filename=(char*)malloc(strlen(argv[0])+10);
|
||||
sprintf(filename,"%s.%d",argv[0],getpid());
|
||||
fd=fopen(filename,"w");
|
||||
fprintf(fd,"%d",getpid());
|
||||
fprintf(stderr,"\npv server pid: %d\n",getpid());
|
||||
fclose(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* server mode functions */
|
||||
|
||||
/* ------------------------------------------ */
|
||||
/* unimplemented channel access open function */
|
||||
/* ------------------------------------------ */
|
||||
BDT* BdtPvOpen(char *IocName, char* PvName)
|
||||
{
|
||||
BDT *bdt;
|
||||
|
||||
if((bdt = BdtIpOpen(IocName, BDT_TCP_PORT)) == NULL)
|
||||
{
|
||||
fprintf(stderr,"open of address %s failed\n", IocName);
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
if(BdtServiceConnect(bdt, BDT_SERVICE_PV, PvName) < 0)
|
||||
{
|
||||
fprintf(stderr,"connect to PV %s failed\n", PvName);
|
||||
BdtClose(bdt);
|
||||
return(NULL);
|
||||
}
|
||||
return(bdt);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
/* open a bulk data socket to a server given the server IP address */
|
||||
/* --------------------------------------------------------------- */
|
||||
BDT* BdtIpOpen(char* address, int Port)
|
||||
{
|
||||
struct hostent *pHostent;
|
||||
struct sockaddr_in tsin;
|
||||
unsigned long addr;
|
||||
int osoc;
|
||||
BDT *bdt;
|
||||
|
||||
#ifndef vxWorks
|
||||
/* Deal with the name -vs- IP number issue. */
|
||||
if (isdigit(address[0]))
|
||||
#endif
|
||||
addr=inet_addr(address);
|
||||
#ifndef vxWorks
|
||||
else
|
||||
{
|
||||
if ((pHostent = gethostbyname (address)) == NULL)
|
||||
return(NULL);
|
||||
bcopy (pHostent->h_addr, (char *) &addr, sizeof(addr));
|
||||
printf("Converting name >%s< to IP number %08.8X\n", address, addr);
|
||||
}
|
||||
#endif
|
||||
|
||||
tsin.sin_port=0;
|
||||
tsin.sin_family=AF_INET;
|
||||
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
|
||||
|
||||
if((osoc=socket(AF_INET,SOCK_STREAM,BDT_TCP))<0)
|
||||
{
|
||||
perror("BdtIpOpen: create socket failed");
|
||||
return (BDT*)NULL;
|
||||
}
|
||||
|
||||
if((bind(osoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
|
||||
{
|
||||
perror("BdtIpOpen: local address bind failed");
|
||||
return (BDT*)NULL;
|
||||
}
|
||||
|
||||
tsin.sin_port=htons(Port);
|
||||
memcpy((char*)&tsin.sin_addr,(char*)&addr,sizeof(addr));
|
||||
|
||||
if(connect(osoc,(struct sockaddr*)&tsin,sizeof(tsin))<0)
|
||||
{
|
||||
perror("BdtIpOpen: connect failed");
|
||||
close(osoc);
|
||||
return (BDT*)NULL;
|
||||
}
|
||||
|
||||
bdt=(BDT*)malloc(sizeof(BDT));
|
||||
bdt->soc=osoc;
|
||||
bdt->remaining_send=0;
|
||||
bdt->remaining_recv=0;
|
||||
bdt->state=BdtUnbound;
|
||||
|
||||
#ifndef vxWorks
|
||||
{
|
||||
int j;
|
||||
j = fcntl(bdt->soc, F_GETFL, 0);
|
||||
fcntl(bdt->soc, F_SETFL, j|O_NDELAY);
|
||||
}
|
||||
#endif
|
||||
/* now connected to the bulk data socket on the IOC */
|
||||
return bdt;
|
||||
}
|
||||
|
||||
/* -------------------------------------- */
|
||||
/* write size bytes from buffer to socket */
|
||||
/* -------------------------------------- */
|
||||
int BdtWrite(int soc,void* buffer,int size)
|
||||
{
|
||||
int rc;
|
||||
int total;
|
||||
unsigned char* data;
|
||||
fd_set fds;
|
||||
struct timeval to;
|
||||
|
||||
data=(unsigned char*)buffer;
|
||||
total=size;
|
||||
|
||||
to.tv_sec = 5;
|
||||
to.tv_usec = 0;
|
||||
|
||||
do
|
||||
{
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(soc, &fds);
|
||||
if (select(soc+1, NULL, &fds, NULL, &to) != 1)
|
||||
{
|
||||
printf("BdtWrite: timeout waiting to write data\n");
|
||||
return(-1);
|
||||
}
|
||||
/* send block of data */
|
||||
if((rc=send(soc,&data[size-total],total,0))<0)
|
||||
{
|
||||
if(errno == EINTR)
|
||||
rc = 0;
|
||||
else
|
||||
perror("BdtWrite: Send to remote failed");
|
||||
}
|
||||
else
|
||||
total-=rc;
|
||||
}
|
||||
while(rc>0 && total>0);
|
||||
|
||||
return (rc<=0)?-1:0;
|
||||
}
|
||||
|
||||
/* --------------------------------------- */
|
||||
/* send a message header down a BDT socket */
|
||||
/* --------------------------------------- */
|
||||
int BdtSendHeader(BDT* bdt,unsigned short verb,int size)
|
||||
{
|
||||
BdtMsgHead buf;
|
||||
|
||||
if(bdt->state!=BdtIdle)
|
||||
{
|
||||
fprintf(stderr,"BdtSendHeader: Interface not idle\n");
|
||||
bdt->state=BdtBad;
|
||||
return -1;
|
||||
}
|
||||
|
||||
buf.verb=htons(verb);
|
||||
buf.size=htonl((unsigned long)size);
|
||||
|
||||
if(BdtWrite(bdt->soc,&buf.verb, sizeof(buf.verb))<0)
|
||||
{
|
||||
fprintf(stderr,"BdtSendHeader: write to remote failed");
|
||||
return -1;
|
||||
}
|
||||
if(BdtWrite(bdt->soc,&buf.size, sizeof(buf.size))<0)
|
||||
{
|
||||
fprintf(stderr,"BdtSendHeader: write to remote failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* don't wait for response if data must go out */
|
||||
if(size)
|
||||
{
|
||||
bdt->remaining_send=size;
|
||||
bdt->state=BdtSData;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------- */
|
||||
/* send a message data chunk down a BDT socket */
|
||||
/* ------------------------------------------- */
|
||||
int BdtSendData(BDT* bdt,void* buffer,int size)
|
||||
{
|
||||
int len;
|
||||
int remaining;
|
||||
int rc;
|
||||
|
||||
if(bdt->state!=BdtSData)
|
||||
{
|
||||
fprintf(stderr,"BdtSendData: Interface not in send data mode\n");
|
||||
bdt->state=BdtBad;
|
||||
return -1;
|
||||
}
|
||||
|
||||
remaining=bdt->remaining_send-size;
|
||||
|
||||
if(remaining<0)
|
||||
{
|
||||
fprintf(stderr,"WARNING -- BdtSendData: To much data to send\n");
|
||||
len=bdt->remaining_send;
|
||||
}
|
||||
else
|
||||
len=size;
|
||||
|
||||
if (BdtWrite(bdt->soc, buffer, len) < 0)
|
||||
return -1;
|
||||
|
||||
bdt->remaining_send-=len;
|
||||
|
||||
if(bdt->remaining_send<0)
|
||||
{
|
||||
fprintf(stderr,"BdtSendData: To much data Sent\n");
|
||||
bdt->remaining_send=0;
|
||||
}
|
||||
|
||||
if(bdt->remaining_send==0)
|
||||
bdt->state=BdtIdle;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int BdtFlushOutput(BDT* bdt)
|
||||
{
|
||||
#ifdef vxWorks
|
||||
ioctl(bdt->soc, FIOWFLUSH, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* ------------------------------------- */
|
||||
/* Read exactly size bytes from remote */
|
||||
/* ------------------------------------- */
|
||||
int BdtRead(int soc,void* buffer,int size)
|
||||
{
|
||||
int rc,total;
|
||||
unsigned char* data;
|
||||
fd_set fds;
|
||||
struct timeval to;
|
||||
|
||||
to.tv_sec = 5;
|
||||
to.tv_usec = 0;
|
||||
|
||||
data=(unsigned char*)buffer;
|
||||
total=size;
|
||||
|
||||
do
|
||||
{
|
||||
#if 1
|
||||
/* wait for data chunk */
|
||||
FD_ZERO(&fds);
|
||||
FD_SET(soc, &fds);
|
||||
if (select(soc+1, &fds, NULL, NULL, &to) != 1)
|
||||
{
|
||||
printf("BdtRead: timeout waiting for data\n");
|
||||
return(-1);
|
||||
}
|
||||
#endif
|
||||
if((rc=recv(soc,&data[size-total],total,0))<0)
|
||||
{
|
||||
if(errno==EINTR)
|
||||
{
|
||||
printf("BdtRead: EINTR");
|
||||
rc=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
perror("BdtRead: Receive data chunk failed");
|
||||
}
|
||||
}
|
||||
else
|
||||
total-=rc;
|
||||
}
|
||||
while(rc>0 && total>0);
|
||||
|
||||
return (rc<=0)?-1:0;
|
||||
}
|
||||
|
||||
/* ------------------------------------- */
|
||||
/* wait for a message header from remote */
|
||||
/* ------------------------------------- */
|
||||
int BdtReceiveHeader(BDT* bdt,int* verb,int* size)
|
||||
{
|
||||
BdtMsgHead buf;
|
||||
|
||||
/* can only receive header when in the idle state */
|
||||
if (bdt->state == BdtEof)
|
||||
return -1;
|
||||
|
||||
if(bdt->state != BdtIdle)
|
||||
{
|
||||
fprintf(stderr,"BdtReceiveHeader: Interface not idle\n");
|
||||
bdt->state=BdtBad;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(BdtRead(bdt->soc,&buf.verb,sizeof(buf.verb))<0)
|
||||
{
|
||||
fprintf(stderr,"BdtReceiveHeader: Read failed\n");
|
||||
return -1;
|
||||
}
|
||||
if(BdtRead(bdt->soc,&buf.size,sizeof(buf.size))<0)
|
||||
{
|
||||
fprintf(stderr,"BdtReceiveHeader: Read failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* copy message data to user */
|
||||
*verb=ntohs(buf.verb);
|
||||
*size=ntohl(buf.size);
|
||||
|
||||
if(*size)
|
||||
bdt->state=BdtRData;
|
||||
|
||||
bdt->remaining_recv=*size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------
|
||||
Wait for a chunk of data from remote.
|
||||
User can continually call this with a maximum size until it return 0.
|
||||
------------------------------------------------------------------------ */
|
||||
int BdtReceiveData(BDT* bdt,void* buffer,int size)
|
||||
{
|
||||
int rc;
|
||||
|
||||
/* can only receive data when in the receive data state */
|
||||
switch(bdt->state)
|
||||
{
|
||||
case BdtRData: break;
|
||||
case BdtIdle: return 0;
|
||||
default:
|
||||
fprintf(stderr,"BdtReceiveData: bad receive state\n");
|
||||
bdt->state=BdtBad;
|
||||
break;
|
||||
}
|
||||
|
||||
if (bdt->remaining_recv < size)
|
||||
size = bdt->remaining_recv;
|
||||
|
||||
if(BdtRead(bdt->soc,buffer,size)<0)
|
||||
{
|
||||
fprintf(stderr,"BdtReceiveData: Read failed\n");
|
||||
bdt->state = BdtEof;
|
||||
return -1;
|
||||
}
|
||||
|
||||
bdt->remaining_recv-=size;
|
||||
|
||||
if(bdt->remaining_recv<0)
|
||||
{
|
||||
fprintf(stderr,"BdtReceiveData: To much data received\n");
|
||||
bdt->remaining_recv=0;
|
||||
}
|
||||
|
||||
if(bdt->remaining_recv==0)
|
||||
bdt->state=BdtIdle;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------ */
|
||||
/* connect to a process variable, useful if raw open used */
|
||||
/* ------------------------------------------------------ */
|
||||
int BdtServiceConnect(BDT* bdt, char* Name, char *Args)
|
||||
{
|
||||
int len;
|
||||
int rc;
|
||||
int size;
|
||||
int verb;
|
||||
unsigned char NameLen;
|
||||
unsigned char ArgLen;
|
||||
|
||||
if(bdt->state!=BdtUnbound)
|
||||
{
|
||||
fprintf(stderr,"BdtServiceConnect: can only bind to one service\n");
|
||||
return -1;
|
||||
}
|
||||
bdt->state=BdtIdle;
|
||||
NameLen = strlen(Name)+1;
|
||||
if (Args != NULL)
|
||||
ArgLen = strlen(Args)+1;
|
||||
else
|
||||
ArgLen = 0;
|
||||
|
||||
/* send out connect message */
|
||||
if(BdtSendHeader(bdt, BDT_Connect, NameLen+ArgLen) < 0)
|
||||
{
|
||||
fprintf(stderr,"BdtServiceConnect: send of connect header failed\n");
|
||||
bdt->state=BdtUnbound;
|
||||
return -1;
|
||||
}
|
||||
|
||||
NameLen--;
|
||||
ArgLen--;
|
||||
/* send out the process variable to connect to */
|
||||
if((BdtSendData(bdt, &NameLen, 1) < 0) || (BdtSendData(bdt, Name, NameLen) < 0))
|
||||
|
||||
{
|
||||
fprintf(stderr,"BdtServiceConnect: send of connect body failed\n");
|
||||
bdt->state=BdtUnbound;
|
||||
return -1;
|
||||
}
|
||||
if (ArgLen > 0)
|
||||
{
|
||||
if ((BdtSendData(bdt, &ArgLen, 1) < 0) || (BdtSendData(bdt, Args, ArgLen) < 0))
|
||||
{
|
||||
fprintf(stderr,"BdtServiceConnect: send of connect body failed\n");
|
||||
bdt->state=BdtUnbound;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
rc=0;
|
||||
|
||||
/* wait for response from connect to process variable */
|
||||
if(BdtReceiveHeader(bdt,&verb,&size)<0)
|
||||
{
|
||||
fprintf(stderr,"BdtServiceConnect: receive reponse failed\n");
|
||||
bdt->state=BdtUnbound;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* check response */
|
||||
switch(verb)
|
||||
{
|
||||
case BDT_Ok:
|
||||
rc=0;
|
||||
break;
|
||||
case BDT_Error:
|
||||
fprintf(stderr,"BdtServiceConnect: connection rejected\n");
|
||||
bdt->state=BdtUnbound;
|
||||
rc=-1;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr,"BdtServiceConnect: unknown response from remote\n");
|
||||
bdt->state=BdtUnbound;
|
||||
rc=-1;
|
||||
break;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* -------------------- */
|
||||
/* close the connection */
|
||||
/* -------------------- */
|
||||
int BdtClose(BDT* bdt)
|
||||
{
|
||||
int verb,size,done;
|
||||
|
||||
/* send a close message out */
|
||||
if(BdtSendHeader(bdt,BDT_Close,0)<0)
|
||||
{
|
||||
fprintf(stderr,"BdtClose: Cannot send close message\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
done=0;
|
||||
|
||||
do
|
||||
{
|
||||
/* check response */
|
||||
if(BdtReceiveHeader(bdt,&verb,&size)<0)
|
||||
{
|
||||
fprintf(stderr,"BdtClose: Close message response error\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(verb)
|
||||
{
|
||||
case BDT_Ok:
|
||||
done=1;
|
||||
break;
|
||||
case BDT_Error:
|
||||
fprintf(stderr,"BdtClose: Close rejected\n");
|
||||
return -1;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
while(done==0);
|
||||
|
||||
bdt->state=BdtUnbound;
|
||||
free(bdt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* --------------------------------------- */
|
||||
/* make a listener socket for UDP - simple */
|
||||
/* --------------------------------------- */
|
||||
int BdtOpenListenerUDP(int Port)
|
||||
{
|
||||
int nsoc;
|
||||
struct sockaddr_in tsin;
|
||||
|
||||
tsin.sin_port=htons(Port);
|
||||
tsin.sin_family=AF_INET;
|
||||
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
|
||||
|
||||
if((nsoc=socket(AF_INET,SOCK_DGRAM,BDT_UDP))<0)
|
||||
{
|
||||
perror("BdtOpenListenerUDP: open socket failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((bind(nsoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
|
||||
{
|
||||
perror("BdtOpenListenerUDP: local bind failed");
|
||||
close(nsoc);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return nsoc;
|
||||
}
|
||||
|
||||
/* --------------------------------------- */
|
||||
/* make a listener socket for TCP - simple */
|
||||
/* --------------------------------------- */
|
||||
int BdtOpenListenerTCP(int Port)
|
||||
{
|
||||
int nsoc;
|
||||
struct sockaddr_in tsin;
|
||||
|
||||
memset (&tsin, 0, sizeof(struct sockaddr_in));
|
||||
tsin.sin_port=htons(Port);
|
||||
tsin.sin_family=htons(AF_INET);
|
||||
tsin.sin_addr.s_addr=htonl(INADDR_ANY);
|
||||
|
||||
if((nsoc=socket(AF_INET,SOCK_STREAM,BDT_TCP))<0)
|
||||
{
|
||||
perror("BdtOpenListenerTCP: open socket failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((bind(nsoc,(struct sockaddr*)&tsin,sizeof(tsin)))<0)
|
||||
{
|
||||
perror("BdtOpenListenerTCP: local bind failed");
|
||||
close(nsoc);
|
||||
return -1;
|
||||
}
|
||||
|
||||
listen(nsoc,5);
|
||||
return nsoc;
|
||||
}
|
||||
|
||||
/* ------------------------------- */
|
||||
/* make BDT from a socket - simple */
|
||||
/* ------------------------------- */
|
||||
BDT* BdtMakeBDT(int soc)
|
||||
{
|
||||
BDT* bdt;
|
||||
bdt=(BDT*)malloc(sizeof(BDT));
|
||||
bdt->soc=soc;
|
||||
bdt->remaining_send=0;
|
||||
bdt->remaining_recv=0;
|
||||
bdt->state=BdtIdle;
|
||||
return bdt;
|
||||
}
|
||||
|
||||
/* --------------------------- */
|
||||
/* free a BDT and close socket */
|
||||
/* --------------------------- */
|
||||
int BdtFreeBDT(BDT* bdt)
|
||||
{
|
||||
close(bdt->soc);
|
||||
free(bdt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int BdtPvPutArray(BDT *bdt, short DbrType, void *Buf, unsigned long NumElements,
|
||||
unsigned long ElementSize)
|
||||
{
|
||||
int Verb;
|
||||
int Size;
|
||||
unsigned long BufSize;
|
||||
|
||||
BufSize = NumElements * ElementSize;
|
||||
if (BdtSendHeader(bdt, BDT_Put, 6 + BufSize) != 0)
|
||||
return(-1);
|
||||
if (BdtSendData(bdt, &DbrType, 2) < 0)
|
||||
return(-1);
|
||||
if (BdtSendData(bdt, &NumElements, 4) < 0)
|
||||
return(-1);
|
||||
if (BdtSendData(bdt, Buf, BufSize) < 0)
|
||||
return(-1);
|
||||
if (BdtReceiveHeader(bdt, &Verb, &Size) != 0)
|
||||
return(-1);
|
||||
if (Verb != BDT_Ok)
|
||||
return(-1);
|
||||
|
||||
return(0);
|
||||
}
|
||||
392
src/bdt/bdtServ.c
Normal file
392
src/bdt/bdtServ.c
Normal file
@@ -0,0 +1,392 @@
|
||||
/*
|
||||
*
|
||||
* Author: John Winans
|
||||
* Date: 95-05-22
|
||||
*
|
||||
* $Log$
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* IOC listener task blocks on accept calls waiting for binders.
|
||||
* If a bind arrives, a receiver task is spawned.
|
||||
*
|
||||
* IOC receiver task blocks on read calls waiting for transactions.
|
||||
* When a transaction arrives it is serviced.
|
||||
* At the end of a transaction service, a response is sent back.
|
||||
* After the response is sent, a chack is made to see if a delta transmission
|
||||
* was blocked by the transaction's use of the socket... if so, it is sent.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <selectLib.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <vxWorks.h>
|
||||
#include <sys/socket.h>
|
||||
#include <in.h>
|
||||
#include <inetLib.h>
|
||||
#include <taskLib.h>
|
||||
#include <sysSymTbl.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "bdt.h"
|
||||
|
||||
#define BDT_TASK_PRIO 200
|
||||
#define BDT_TASK_OPTIONS VX_FP_TASK
|
||||
#define BDT_TASK_STACK 5000
|
||||
#define STATIC static
|
||||
|
||||
/* used for debugging */
|
||||
STATIC char *BdtNames[] = {
|
||||
"BDT_Ok",
|
||||
"BDT_Connect",
|
||||
"BDT_Error",
|
||||
"BDT_Get",
|
||||
"BDT_Put",
|
||||
"BDT_Close",
|
||||
"BDT_Monitor",
|
||||
"BDT_Value",
|
||||
"BDT_Delta",
|
||||
"BDT_Add",
|
||||
"BDT_Delete",
|
||||
"BDT_Ping"
|
||||
};
|
||||
|
||||
STATIC int HexDump(char *ReadBuffer, int rbytes);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* A debugging routine that hex-dumps a message to the console.
|
||||
*
|
||||
*****************************************************************************/
|
||||
void BDT_DumpMessage(BDT *Bdt)
|
||||
{
|
||||
char Buf[16*4];
|
||||
int RecvLen;
|
||||
|
||||
while(Bdt->remaining_recv)
|
||||
{
|
||||
RecvLen = (Bdt->remaining_recv > sizeof(Buf)) ? sizeof(Buf): Bdt->remaining_recv;
|
||||
if (BdtReceiveData(Bdt, Buf, RecvLen) != RecvLen)
|
||||
return; /* Got EOF, (EOM handled by the while() */
|
||||
|
||||
HexDump(Buf, RecvLen);
|
||||
}
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Throw away a message.
|
||||
*
|
||||
****************************************************************************/
|
||||
void BDT_DiscardMessage(BDT *Bdt)
|
||||
{
|
||||
char Buf[16*4];
|
||||
int RecvLen;
|
||||
|
||||
while(Bdt->remaining_recv)
|
||||
{
|
||||
RecvLen = (Bdt->remaining_recv > sizeof(Buf)) ? sizeof(Buf): Bdt->remaining_recv;
|
||||
if (BdtReceiveData(Bdt, Buf, RecvLen) != RecvLen)
|
||||
return; /* Got EOF, (EOM handled by the while() */
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Process a single Connect message. And return a response.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int BDT_ProcessConnect(BDT *Bdt)
|
||||
{
|
||||
SYM_TYPE Type;
|
||||
unsigned char length;
|
||||
char Buf[50];
|
||||
char HandlerName[70];
|
||||
|
||||
if (Bdt->remaining_recv > sizeof(Buf))
|
||||
{
|
||||
printf("BDT_ProcessConnect Connect Message too long %d\n", Bdt->remaining_recv);
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
if (Bdt->remaining_recv < 2)
|
||||
{
|
||||
printf("BDT_ProcessConnect Connect Message w/missing service name\n");
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
BdtReceiveData(Bdt, &length, 1);
|
||||
if (length > sizeof(Buf))
|
||||
{
|
||||
printf("BDT_ProcessConnect Connect Message service name too long %d\n", length);
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
BdtReceiveData(Bdt, Buf, length);
|
||||
Buf[length] = '\0';
|
||||
|
||||
sprintf(HandlerName, "_BDT_ServiceHandler_%s", Buf);
|
||||
printf("BDT_ProcessConnect NAME service (%s)\n", HandlerName);
|
||||
|
||||
/*Bdt->pHandlers = (BdthandlerFunc *)(&BDT_NameServicehandlers);*/
|
||||
if (symFindByName(sysSymTbl, HandlerName, (char **)&(Bdt->pHandlers), &Type) != OK)
|
||||
{
|
||||
printf("BDT_ProcessConnect Connect to unknown service (%s)\n", Buf);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
Bdt->Name = (char *)malloc(strlen(Buf)+1);
|
||||
strcpy(Bdt->Name, Buf);
|
||||
if (Bdt->pHandlers[BDT_Connect] != NULL)
|
||||
return((*(Bdt->pHandlers[BDT_Connect]))(Bdt));
|
||||
else
|
||||
{
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
}
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Process a single message. And return a response.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int BDT_ProcMessage(BDT *Bdt, unsigned short Command)
|
||||
{
|
||||
int RecvLen;
|
||||
|
||||
if (Command > BDT_LAST_VERB)
|
||||
{
|
||||
printf("BDT: %s Invalid command %d, length = %d\n", Bdt->Name, Command, Bdt->remaining_recv);
|
||||
BDT_DumpMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
if (Bdt->pHandlers == NULL)
|
||||
{
|
||||
if (Command == BDT_Connect)
|
||||
BDT_ProcessConnect(Bdt);
|
||||
else
|
||||
{
|
||||
printf("BDT_ProcMessage: %s got %s before connect\n", Bdt->Name, BdtNames[Command]);
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
if (Bdt->pHandlers[Command] == NULL)
|
||||
{
|
||||
printf("BDT_ProcMessage: service %s got %s... invalid\n", Bdt->Name, BdtNames[Command]);
|
||||
}
|
||||
return((*(Bdt->pHandlers[Command]))(Bdt));
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Wait on a socket read for a message. When one arrives, read the header,
|
||||
* decode it, and call the message handler routine to process and respond to it.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC void BDT_ReceiverTask(int Sock)
|
||||
{
|
||||
int Verb;
|
||||
int Size;
|
||||
BDT Bdt;
|
||||
int MonitorLockTimeout = (BDT_PING_INTERVAL*sysClkRateGet())/2;
|
||||
static char *NoBdtName = "(No Name)";
|
||||
fd_set FdSet;
|
||||
struct timeval TimeVal;
|
||||
int PollStatus;
|
||||
int SocketState;
|
||||
|
||||
Bdt.soc = Sock;
|
||||
Bdt.pMonitor = NULL;
|
||||
Bdt.WriteLock = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
|
||||
Bdt.MonitorLock = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
|
||||
Bdt.state = BdtIdle;
|
||||
Bdt.pHandlers = NULL;
|
||||
Bdt.Name = NoBdtName;
|
||||
|
||||
printf("BDT_ReceiverTask(%d) started\n", Sock);
|
||||
|
||||
TimeVal.tv_sec = BDT_CONENCTION_TIMEOUT;
|
||||
TimeVal.tv_usec = 0;
|
||||
FD_ZERO(&FdSet);
|
||||
FD_SET(Bdt.soc, &FdSet);
|
||||
|
||||
SocketState = 0;
|
||||
while (((PollStatus = select(FD_SETSIZE, &FdSet, NULL, NULL, &TimeVal)) > 0) && (BdtReceiveHeader(&Bdt, &Verb, &Size) == 0))
|
||||
{
|
||||
semTake(Bdt.WriteLock, WAIT_FOREVER);
|
||||
|
||||
SocketState = BDT_ProcMessage(&Bdt, Verb);
|
||||
|
||||
if (SocketState != 0)
|
||||
break;
|
||||
|
||||
#if 0
|
||||
if (semTake(Bdt.MonitorLock, MonitorLockTimeout) == OK)
|
||||
{
|
||||
/* Check for delta flag and send if so */
|
||||
|
||||
/* Change this to run thru a delta-message linked list */
|
||||
if (Bdt.pMonitor != NULL)
|
||||
{
|
||||
/* Send delta notifier */
|
||||
}
|
||||
semGive(Bdt.WriteLock); /* Order important for BDT_SendDelta */
|
||||
semGive(Bdt.MonitorLock);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("BDT_ReceiverTask timeout on monitor semaphore. Monitors are stuck!\n");
|
||||
semGive(Bdt.WriteLock);
|
||||
}
|
||||
#else
|
||||
semGive(Bdt.WriteLock);
|
||||
#endif
|
||||
BdtFlushOutput(&Bdt);
|
||||
|
||||
FD_ZERO(&FdSet);
|
||||
FD_SET(Bdt.soc, &FdSet);
|
||||
}
|
||||
if (SocketState == 0)
|
||||
{
|
||||
if (PollStatus == 0)
|
||||
printf("BDT_ReceiverTask(%d) exiting on client timeout\n", Sock);
|
||||
else
|
||||
printf("BDT_ReceiverTask(%d) exiting on I/O error talking to Client\n", Sock);
|
||||
}
|
||||
else
|
||||
printf("BDT_ReceiverTask(%d) received close from client\n", Sock);
|
||||
|
||||
/* Free up resources */
|
||||
if (Bdt.Name != NoBdtName)
|
||||
free(Bdt.Name);
|
||||
|
||||
close(Sock);
|
||||
semDelete(Bdt.WriteLock);
|
||||
semDelete(Bdt.MonitorLock);
|
||||
return;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
******************************************************************************/
|
||||
#if 0
|
||||
int BDT_SendDelta(int Socket, char *Message)
|
||||
{
|
||||
semTake (DeltaFlagLock, WAIT_FOREVER);
|
||||
if (if (semTake(SocketWriteLock, no wait) == failed)
|
||||
{
|
||||
/* Reader task is busy... Post message for future transmission */
|
||||
Bdt.pending_delta = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
write(Message); /* This COULD block */
|
||||
semGive(SocketWriteLock);
|
||||
}
|
||||
semGive(DeltaFlagLock);
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* This task listens on a port for new connections. When one is made, it
|
||||
* spawns a task to manage it.
|
||||
*
|
||||
******************************************************************************/
|
||||
void BDT_ListenerTask(int Port)
|
||||
{
|
||||
/* Open a socket to listen on */
|
||||
struct sockaddr_in ListenerAddr;
|
||||
struct sockaddr_in ClientAddr;
|
||||
int ListenerSock;
|
||||
int ClientSock;
|
||||
int ClientAddrLen;
|
||||
int SockAddrSize = sizeof(struct sockaddr_in);
|
||||
|
||||
if (Port == 0)
|
||||
Port = BDT_TCP_PORT;
|
||||
|
||||
printf("BDT_Listener(%d) started\n", Port);
|
||||
|
||||
if ((ListenerSock = BdtOpenListenerTCP(Port)) < 0)
|
||||
{
|
||||
printf("BDT_ListenerTask(%d) can't start listener\n", Port);
|
||||
return;
|
||||
}
|
||||
|
||||
while (1)
|
||||
{
|
||||
ClientAddrLen = sizeof(ClientAddr);
|
||||
if((ClientSock = accept(ListenerSock, (struct sockaddr*)&ClientAddr, &ClientAddrLen)) < 0)
|
||||
{
|
||||
if(errno!=EINTR)
|
||||
{
|
||||
printf("BDT_ListenerTask(%d) accept() failed\n", Port);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Spawn a task to handle the new connection */
|
||||
printf("Accepted a connection\n");
|
||||
taskSpawn("BDT", BDT_TASK_PRIO, BDT_TASK_OPTIONS, BDT_TASK_STACK, (FUNCPTR)BDT_ReceiverTask, ClientSock, 2,3,4,5,6,7,8,9,0);
|
||||
}
|
||||
}
|
||||
/* Never reached */
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* A handy routine to assist in debugging.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int HexDump(char *ReadBuffer, int rbytes)
|
||||
{
|
||||
int c = 0;
|
||||
int i = 0;
|
||||
int firsttime;
|
||||
char ascii[20]; /* To hold printable portion of string */
|
||||
|
||||
if (!rbytes)
|
||||
return(0);
|
||||
|
||||
firsttime = 1;
|
||||
while(c < rbytes)
|
||||
{
|
||||
if ((c % 16) == 0)
|
||||
{
|
||||
if (!firsttime)
|
||||
{
|
||||
ascii[i] = '\0';
|
||||
printf(" *%s*\n", ascii);
|
||||
}
|
||||
firsttime=0;
|
||||
i = 0;
|
||||
}
|
||||
printf(" %02.2X", ReadBuffer[c] & 0xff);
|
||||
ascii[i] = ReadBuffer[c];
|
||||
if (!isprint(ascii[i]))
|
||||
ascii[i] = '.';
|
||||
++i;
|
||||
++c;
|
||||
}
|
||||
while (c%16)
|
||||
{
|
||||
fputs(" ", stdout);
|
||||
++c;
|
||||
}
|
||||
ascii[i] = '\0';
|
||||
printf(" *%s*\n", ascii);
|
||||
return(0);
|
||||
}
|
||||
129
src/bdt/bdtServName.c
Normal file
129
src/bdt/bdtServName.c
Normal file
@@ -0,0 +1,129 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Author: John Winans
|
||||
* Date: 95-06-05
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* $Log$
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <selectLib.h>
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* IOC listener task blocks on accept calls waiting for binders.
|
||||
* If a bind arrives, a receiver task is spawned.
|
||||
*
|
||||
* IOC receiver task blocks on read calls waiting for transactions.
|
||||
* When a transaction arrives it is serviced.
|
||||
* At the end of a transaction service, a response is sent back.
|
||||
* After the response is sent, a chack is made to see if a delta transmission
|
||||
* was blocked by the transaction's use of the socket... if so, it is sent.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <sys/socket.h>
|
||||
#include <in.h>
|
||||
#include <inetLib.h>
|
||||
#include <taskLib.h>
|
||||
|
||||
#include "bdt.h"
|
||||
|
||||
#define STATIC static
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_NameServiceOk(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceOk \n");
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_NameServiceConnect(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceConnect \n");
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceError(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceError \n");
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceGet(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceGet \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServicePut(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServicePut \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceClose(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceClose \n");
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceMonitor(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceMonitor \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceValue(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceValue \n");
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceDelta(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceDelta \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceAdd(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceAdd \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServiceDelete(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServiceDelete \n");
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
STATIC int BDT_NameServicePing(BDT *Bdt)
|
||||
{
|
||||
printf("BDT_NameServicePing \n");
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
BdtHandlers BDT_ServiceHandler_name =
|
||||
{
|
||||
BDT_NameServiceOk,
|
||||
BDT_NameServiceConnect,
|
||||
BDT_NameServiceError,
|
||||
BDT_NameServiceGet,
|
||||
BDT_NameServicePut,
|
||||
BDT_NameServiceClose,
|
||||
BDT_NameServiceMonitor,
|
||||
BDT_NameServiceValue,
|
||||
BDT_NameServiceDelta,
|
||||
BDT_NameServiceAdd,
|
||||
BDT_NameServiceDelete,
|
||||
BDT_NameServicePing
|
||||
};
|
||||
377
src/bdt/bdtServPv.c
Normal file
377
src/bdt/bdtServPv.c
Normal file
@@ -0,0 +1,377 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Author: John Winans
|
||||
* Date: 95-06-05
|
||||
*
|
||||
* $Id$
|
||||
*
|
||||
* $Log$
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <semLib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <dbCommon.h>
|
||||
#include <dbAccess.h>
|
||||
|
||||
#include "bdt.h"
|
||||
|
||||
#define STATIC static
|
||||
#define MESSAGE_PREFIX "BDT PV server:"
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* These conversion finctions take care of one of the most insane parts
|
||||
* of dealing with database access... having two different interfaces that
|
||||
* have the same named enumerators in two seperate header files... that
|
||||
* therefore can not be both included in the same file.
|
||||
*
|
||||
* This is so bad, I wanted to vomit when typing it in.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int DbrOld2New(int Old)
|
||||
{
|
||||
switch (Old)
|
||||
{
|
||||
case 0: return(DBR_STRING);
|
||||
case 1: return(DBR_SHORT);
|
||||
case 2: return(DBR_FLOAT);
|
||||
case 3: return(DBR_ENUM);
|
||||
case 4: return(DBR_CHAR);
|
||||
case 5: return(DBR_LONG);
|
||||
case 6: return(DBR_DOUBLE);
|
||||
default:
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
|
||||
STATIC int DbrNew2Old(int New)
|
||||
{
|
||||
switch (New)
|
||||
{
|
||||
case DBR_STRING: return(0);
|
||||
case DBR_CHAR: return(4);
|
||||
case DBR_UCHAR: return(4);
|
||||
case DBR_SHORT: return(1);
|
||||
case DBR_USHORT: return(1);
|
||||
case DBR_LONG: return(5);
|
||||
case DBR_ULONG: return(5);
|
||||
case DBR_FLOAT: return(2);
|
||||
case DBR_DOUBLE: return(6);
|
||||
case DBR_ENUM: return(3);
|
||||
default:
|
||||
return(-1);
|
||||
}
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of an OK message.
|
||||
*
|
||||
* The OK message is received as a confirmation of the last operation. It is
|
||||
* not normally responded to.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceOk(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Ok message\n", MESSAGE_PREFIX);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Connect message.
|
||||
*
|
||||
* The Connect is received when a new connection is first made.
|
||||
* Any arguments left in the message body have not yet been read.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceConnect(BDT *Bdt)
|
||||
{
|
||||
unsigned char Length;
|
||||
char Buf[100];
|
||||
struct dbAddr *pDbAddr;
|
||||
|
||||
Buf[0] = '\0';
|
||||
if (Bdt->remaining_recv > 0)
|
||||
{
|
||||
BdtReceiveData(Bdt, &Length, 1);
|
||||
if (Length <= sizeof(Buf))
|
||||
{
|
||||
BdtReceiveData(Bdt, Buf, Length);
|
||||
Buf[Length] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%s Connect message argument list too long\n", MESSAGE_PREFIX);
|
||||
BDT_DiscardMessage(Bdt);
|
||||
return(-1);
|
||||
}
|
||||
|
||||
}
|
||||
#ifdef DEBUG_VERBOSE
|
||||
printf("%s got Connect >%s<\n", MESSAGE_PREFIX, Buf);
|
||||
#endif
|
||||
/* Find the PV in the database */
|
||||
Bdt->pService = malloc(sizeof(struct dbAddr));
|
||||
pDbAddr = (struct dbAddr *)(Bdt->pService);
|
||||
if (dbNameToAddr(Buf, pDbAddr))
|
||||
{
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
free(Bdt->pService);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pDbAddr->dbr_field_type != pDbAddr->field_type)
|
||||
{
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
free(Bdt->pService);
|
||||
}
|
||||
else
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of an Error message.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceError(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Error message\n", MESSAGE_PREFIX);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Get message.
|
||||
*
|
||||
* The response to a Get message is either an Error or a Value:
|
||||
*
|
||||
* Value message body format:
|
||||
* SHORT EPICS data type enumerator (in old format)
|
||||
* LONG Number of elements
|
||||
* CHAR[] Value image
|
||||
*
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceGet(BDT *Bdt)
|
||||
{
|
||||
void *Buf;
|
||||
struct dbAddr *pDbAddr = (struct dbAddr *)(Bdt->pService);
|
||||
long NumElements;
|
||||
long Size;
|
||||
long l;
|
||||
short OldType;
|
||||
int stat;
|
||||
|
||||
#ifdef DEBUG_VERBOSE
|
||||
printf("%s got a Get message\n", MESSAGE_PREFIX);
|
||||
|
||||
printf("field type=%d, field size=%d, elements=%d\n", pDbAddr->field_type, pDbAddr->field_size, pDbAddr->no_elements);
|
||||
#endif
|
||||
|
||||
OldType = DbrNew2Old(pDbAddr->field_type);
|
||||
if (OldType < 0)
|
||||
{
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
/* Allocate a buffer to hold the response message data */
|
||||
Buf = malloc(pDbAddr->field_size * pDbAddr->no_elements);
|
||||
if (Buf == NULL)
|
||||
{
|
||||
printf("Can't allocate %d-byte buffer for get request to %s\n",
|
||||
pDbAddr->field_size * pDbAddr->no_elements,
|
||||
pDbAddr->precord->name);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
/* Get the response message data */
|
||||
NumElements = pDbAddr->no_elements;
|
||||
if (stat=dbGetField(pDbAddr, pDbAddr->field_type, Buf, 0, &NumElements, NULL))
|
||||
{
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
#if 0
|
||||
/* Test hack to transfer HUGE buffers */
|
||||
NumElements = pDbAddr->no_elements;
|
||||
#endif
|
||||
/* Send the response message */
|
||||
Size = NumElements * pDbAddr->field_size;
|
||||
BdtSendHeader(Bdt, BDT_Value, Size + sizeof(long) + sizeof(short));
|
||||
BdtSendData(Bdt, &OldType, sizeof(short));
|
||||
BdtSendData(Bdt, &NumElements, sizeof(long));
|
||||
if (Size)
|
||||
BdtSendData(Bdt, Buf, Size);
|
||||
free(Buf);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Put message.
|
||||
*
|
||||
* Put message body format:
|
||||
* SHORT EPICS data type enumerator
|
||||
* LONG Number of elements
|
||||
* CHAR[] Value image
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServicePut(BDT *Bdt)
|
||||
{
|
||||
long Size;
|
||||
void *Buf;
|
||||
short DbrType;
|
||||
long NumElements;
|
||||
struct dbAddr *pDbAddr = (struct dbAddr *)(Bdt->pService);
|
||||
|
||||
#ifdef DEBUG_VERBOSE
|
||||
printf("%s got a Put message\n", MESSAGE_PREFIX);
|
||||
#endif
|
||||
if (BdtGetResidualRead(Bdt) < 6)
|
||||
{
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
if (BdtGetResidualRead(Bdt) == 6)
|
||||
{ /* Do data contents, just toss it */
|
||||
BDT_DiscardMessage(Bdt);
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
Buf = malloc(BdtGetResidualRead(Bdt) - 6);
|
||||
if (Buf == NULL)
|
||||
{
|
||||
printf("Can't allocate %d-byte buffer for put request to %s\n",
|
||||
BdtGetResidualRead(Bdt), pDbAddr->precord->name);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
BdtReceiveData(Bdt, &DbrType, 2);
|
||||
BdtReceiveData(Bdt, &NumElements, 4);
|
||||
|
||||
#ifdef DEBUG_VERBOSE
|
||||
printf("record field type=%d, field size=%d, elements=%d\n", pDbAddr->field_type, pDbAddr->field_size, pDbAddr->no_elements);
|
||||
printf("message field type=%d, field size=%d, elements=%d total %d\n", DbrType, pDbAddr->field_type ,NumElements, BdtGetResidualRead(Bdt));
|
||||
#endif
|
||||
|
||||
BdtReceiveData(Bdt, Buf, BdtGetResidualRead(Bdt));
|
||||
DbrType = DbrOld2New(DbrType);
|
||||
|
||||
if (DbrType < 0)
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
else if (dbPutField(pDbAddr, DbrType, Buf, NumElements))
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
else
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
|
||||
free(Buf);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Close message.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceClose(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Close message\n", MESSAGE_PREFIX);
|
||||
free(Bdt->pService);
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(1);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Monitor message.
|
||||
*
|
||||
* Not Supported.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceMonitor(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Monitor message\n", MESSAGE_PREFIX);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Value message.
|
||||
*
|
||||
* Not Supported.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceValue(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Value message\n", MESSAGE_PREFIX);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Delta message.
|
||||
*
|
||||
* Not Supported.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceDelta(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Delta message\n", MESSAGE_PREFIX);
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of an Add message.
|
||||
*
|
||||
* Not Supported.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceAdd(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Add message\n", MESSAGE_PREFIX);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Delete message.
|
||||
*
|
||||
* Not Supported.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServiceDelete(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Delete message\n", MESSAGE_PREFIX);
|
||||
BdtSendHeader(Bdt, BDT_Error, 0);
|
||||
return(0);
|
||||
}
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Handle the receipt of a Ping message.
|
||||
*
|
||||
*****************************************************************************/
|
||||
STATIC int BDT_ServicePing(BDT *Bdt)
|
||||
{
|
||||
printf("%s got a Ping message\n", MESSAGE_PREFIX);
|
||||
BdtSendHeader(Bdt, BDT_Ok, 0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
BdtHandlers BDT_ServiceHandler_pv =
|
||||
{
|
||||
BDT_ServiceOk,
|
||||
BDT_ServiceConnect,
|
||||
BDT_ServiceError,
|
||||
BDT_ServiceGet,
|
||||
BDT_ServicePut,
|
||||
BDT_ServiceClose,
|
||||
BDT_ServiceMonitor,
|
||||
BDT_ServiceValue,
|
||||
BDT_ServiceDelta,
|
||||
BDT_ServiceAdd,
|
||||
BDT_ServiceDelete,
|
||||
BDT_ServicePing
|
||||
};
|
||||
18
src/bpt/Makefile
Normal file
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
|
||||
|
||||
11
src/bpt/Makefile.Unix
Normal file
11
src/bpt/Makefile.Unix
Normal file
@@ -0,0 +1,11 @@
|
||||
EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
|
||||
|
||||
SRCS.c = ../makeBpt
|
||||
OBJS = makeBpt
|
||||
PROD = makeBpt
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
25
src/bpt/Makefile.Vx
Normal file
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.ascii
|
||||
BPTS += bptTypeJdegF.ascii
|
||||
BPTS += bptTypeKdegC.ascii
|
||||
BPTS += bptTypeKdegF.ascii
|
||||
|
||||
|
||||
SRCS.c = \
|
||||
../cvtBpt.c
|
||||
|
||||
LIBOBJS = \
|
||||
cvtBpt.o
|
||||
|
||||
LIBNAME = pbtLib
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
142
src/bpt/bptTypeJdegC.data
Normal file
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
|
||||
*
|
||||
* Author: Marty Kraimer
|
||||
* Date: 04OCT95
|
||||
* This is adaptation of old bldCvtTable
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
@@ -29,63 +30,76 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* nnn mm-dd-yy nnn Comment
|
||||
* .02 05-18-92 rcz New database access
|
||||
* .03 12-11-92 mrk ANSI prototypes
|
||||
* 01 04OCT95 mrk Taken from old bldCvtTable
|
||||
*/
|
||||
#include <vxWorks.h>
|
||||
#include <types.h>
|
||||
#include <stdioLib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <cvtTable.h>
|
||||
#include <dbAccess.h>
|
||||
#include <ellLib.h>
|
||||
#include <dbBase.h>
|
||||
#include <dbStaticLib.h>
|
||||
#include <cvtTable.h>
|
||||
#include <epicsPrint.h>
|
||||
|
||||
extern struct dbBase *pdbBase;
|
||||
extern struct dbBase *pdbbase;
|
||||
|
||||
|
||||
|
||||
#ifdef __STDC__
|
||||
long cvtRawToEngBpt(double *pval,short linr,short init, void **ppbrk, short *plbrk)
|
||||
#else /* __STDC__ */
|
||||
long cvtRawToEngBpt(pval, linr, init, ppbrk, plbrk)
|
||||
double *pval;
|
||||
short linr;
|
||||
short init;
|
||||
void **ppbrk;
|
||||
short *plbrk;
|
||||
#endif /* __STDC__ */
|
||||
static brkTable *findBrkTable(short linr)
|
||||
{
|
||||
double val=*pval;
|
||||
long status=0;
|
||||
struct brkTable *pbrkTable;
|
||||
struct brkInt *pInt;
|
||||
struct brkInt *pnxtInt;
|
||||
short lbrk;
|
||||
int number;
|
||||
struct arrBrkTable *pcvtTable;
|
||||
brkTable *pbrkTable;
|
||||
dbMenu *pdbMenu;
|
||||
char name[50];
|
||||
char *pname = name;
|
||||
int len,ind;
|
||||
|
||||
if(linr < 2) return(-1);
|
||||
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
|
||||
if( !(pcvtTable=pdbBase->pcvtTable) || (pcvtTable->number < linr)
|
||||
|| (!(pcvtTable->papBrkTable[linr]))) {
|
||||
errMessage(S_db_badField,"Breakpoint Table not Found");
|
||||
return(S_db_badField);
|
||||
}
|
||||
*ppbrk = (void *)(pcvtTable->papBrkTable[linr]);
|
||||
/* Just start at the beginning */
|
||||
*plbrk=0;
|
||||
}
|
||||
|
||||
pbrkTable = (struct brkTable *)*ppbrk;
|
||||
number = pbrkTable->number;
|
||||
lbrk = *plbrk;
|
||||
/*make sure we dont go off end of table*/
|
||||
if( (lbrk+1) >= number ) lbrk--;
|
||||
pInt = pbrkTable->papBrkInt[lbrk];
|
||||
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
|
||||
/* find entry for increased value */
|
||||
while( (pnxtInt->raw) <= val ) {
|
||||
pdbMenu = dbFindMenu(pdbbase,"menuConvert");
|
||||
len = strlen(pdbMenu->papChoiceValue[linr]);
|
||||
if(len>=sizeof(name)) {
|
||||
epicsPrintf("Break Tables(findBrkTable) choice name too long\n");
|
||||
return(0);
|
||||
}
|
||||
strcpy(pname,pdbMenu->papChoiceValue[linr]);
|
||||
for(ind=0; ind<strlen(pname); ind++) {
|
||||
if(!isalnum(pname[ind])) {
|
||||
pname[ind] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
pbrkTable = dbFindBrkTable(pdbbase,pname);
|
||||
return(pbrkTable);
|
||||
}
|
||||
|
||||
long cvtRawToEngBpt(double *pval,short linr,short init, void **ppbrk,
|
||||
short *plbrk)
|
||||
{
|
||||
double val=*pval;
|
||||
long status=0;
|
||||
brkTable *pbrkTable;
|
||||
brkInt *pInt;
|
||||
brkInt *pnxtInt;
|
||||
short lbrk;
|
||||
int number;
|
||||
|
||||
|
||||
if(linr < 2) return(-1);
|
||||
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
|
||||
pbrkTable = findBrkTable(linr);
|
||||
if(!pbrkTable) return(S_dbLib_badField);
|
||||
*ppbrk = (void *)pbrkTable;
|
||||
/* Just start at the beginning */
|
||||
*plbrk=0;
|
||||
}
|
||||
pbrkTable = (struct brkTable *)*ppbrk;
|
||||
number = pbrkTable->number;
|
||||
lbrk = *plbrk;
|
||||
/*make sure we dont go off end of table*/
|
||||
if( (lbrk+1) >= number ) lbrk--;
|
||||
pInt = pbrkTable->papBrkInt[lbrk];
|
||||
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
|
||||
/* find entry for increased value */
|
||||
while( (pnxtInt->raw) <= val ) {
|
||||
lbrk++;
|
||||
pInt = pbrkTable->papBrkInt[lbrk];
|
||||
if( lbrk >= number-1) {
|
||||
@@ -93,54 +107,40 @@ short *plbrk;
|
||||
break;
|
||||
}
|
||||
pnxtInt = pbrkTable->papBrkInt[lbrk+1];
|
||||
}
|
||||
while( (pInt->raw) > val) {
|
||||
}
|
||||
while( (pInt->raw) > val) {
|
||||
if(lbrk==0) {
|
||||
status=1;
|
||||
break;
|
||||
}
|
||||
lbrk--;
|
||||
pInt = pbrkTable->papBrkInt[lbrk];
|
||||
}
|
||||
*plbrk = lbrk;
|
||||
*pval = pInt->eng + (val - pInt->raw) * pInt->slope;
|
||||
return(status);
|
||||
}
|
||||
*plbrk = lbrk;
|
||||
*pval = pInt->eng + (val - pInt->raw) * pInt->slope;
|
||||
return(status);
|
||||
}
|
||||
|
||||
#ifdef __STDC__
|
||||
long cvtEngToRawBpt(double *pval,short linr,short init,
|
||||
void **ppbrk,short *plbrk)
|
||||
#else /* __STDC__ */
|
||||
long cvtEngToRawBpt(pval,linr, init,ppbrk,plbrk)
|
||||
double *pval;
|
||||
short linr;
|
||||
short init;
|
||||
void **ppbrk;
|
||||
short *plbrk;
|
||||
#endif /* __STDC__ */
|
||||
{
|
||||
double val=*pval;
|
||||
long status=0;
|
||||
struct brkTable *pbrkTable;
|
||||
struct brkInt *pInt;
|
||||
struct brkInt *pnxtInt;
|
||||
short lbrk;
|
||||
int number;
|
||||
struct arrBrkTable *pcvtTable;
|
||||
double val=*pval;
|
||||
long status=0;
|
||||
brkTable *pbrkTable;
|
||||
brkInt *pInt;
|
||||
brkInt *pnxtInt;
|
||||
short lbrk;
|
||||
int number;
|
||||
|
||||
|
||||
if(linr < 2) return(-1);
|
||||
if(init==TRUE || *ppbrk == NULL) { /*must find breakpoint table*/
|
||||
if( !(pcvtTable=pdbBase->pcvtTable) || (pcvtTable->number < linr)
|
||||
|| (!(pcvtTable->papBrkTable[linr]))) {
|
||||
errMessage(S_db_badField,"Breakpoint Table not Found");
|
||||
return(S_db_badField);
|
||||
}
|
||||
*ppbrk = (void *)(pcvtTable->papBrkTable[linr]);
|
||||
pbrkTable = findBrkTable(linr);
|
||||
if(!pbrkTable) return(S_dbLib_badField);
|
||||
*ppbrk = (void *)pbrkTable;
|
||||
/* Just start at the beginning */
|
||||
*plbrk=0;
|
||||
}
|
||||
|
||||
pbrkTable = (struct brkTable *)*ppbrk;
|
||||
number = pbrkTable->number;
|
||||
lbrk = *plbrk;
|
||||
405
src/bpt/makeBpt.c
Normal file
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,".ascii");
|
||||
inFile = fopen(argv[1],"r");
|
||||
if(!inFile) {
|
||||
fprintf(stderr,"Error opening %s\n",argv[1]);
|
||||
exit(-1);
|
||||
}
|
||||
outFile = fopen(outFilename,"w");
|
||||
if(!outFile) {
|
||||
fprintf(stderr,"Error opening %s\n",outFilename);
|
||||
exit(-1);
|
||||
}
|
||||
while(fgets(inbuf,MAX_LINE_SIZE,inFile)) {
|
||||
linenum++;
|
||||
inbuf[strlen(inbuf)] = '\0'; /* remove newline*/
|
||||
pbeg = inbuf;
|
||||
while(isspace(*pbeg) && *pbeg!= '\0') pbeg++;
|
||||
if(*pbeg == '!' || *pbeg == '\0') continue;
|
||||
while(*pbeg!='"' && *pbeg!= '\0') pbeg++;
|
||||
if(*pbeg!='"' ) errExit("Illegal Header");
|
||||
pbeg++; pend = pbeg;
|
||||
while(*pend!='"' && *pend!= '\0') pend++;
|
||||
if(*pend!='"') errExit("Illegal Header");
|
||||
len = pend - pbeg;
|
||||
if(len<=1) errExit("Illegal Header");
|
||||
pname = calloc(len,sizeof(char));
|
||||
strncpy(pname,pbeg,len);
|
||||
pbeg = pend + 1;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.engLow = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.rawLow = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.engHigh = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.rawHigh = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.accuracy = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.tblEngFirst = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.tblEngLast = value;
|
||||
if(getNumber(&pbeg,&value)) errExit("Illegal Header");
|
||||
brkCreateInfo.tblEngDelta = value;
|
||||
goto got_header;
|
||||
}
|
||||
errExit("Illegal Header");
|
||||
got_header:
|
||||
phead = pnext = 0;
|
||||
ndata = 0;
|
||||
errno = 0;
|
||||
while(fgets(inbuf,MAX_LINE_SIZE,inFile)) {
|
||||
float value;
|
||||
|
||||
inbuf[strlen(inbuf)] = '\0'; /* remove newline*/
|
||||
pbeg = inbuf;
|
||||
while(!getNumber(&pbeg,&value)) {
|
||||
ndata++;
|
||||
pdataList = (dataList *)calloc(1,sizeof(dataList));
|
||||
if(!phead)
|
||||
phead = pdataList;
|
||||
else
|
||||
pnext->next = pdataList;
|
||||
pdataList->value = value;
|
||||
pnext = pdataList;
|
||||
}
|
||||
}
|
||||
brkCreateInfo.nTable = ndata;
|
||||
pdata = (float *)calloc(brkCreateInfo.nTable,sizeof(float));
|
||||
pnext = phead;
|
||||
for(n=0; n<brkCreateInfo.nTable; n++) {
|
||||
pdata[n] = pnext->value;
|
||||
pdataList = pnext;
|
||||
pnext = pnext->next;
|
||||
free((void *)pdataList);
|
||||
}
|
||||
brkCreateInfo.pTable = pdata;
|
||||
if(create_break(&brkCreateInfo,&brkint[0],MAX_BREAKS,&nBreak))
|
||||
errExit("create_break failed\n");
|
||||
fprintf(outFile,"breaktable(%s) {\n",pname);
|
||||
for(n=0; n<nBreak; n++) {
|
||||
fprintf(outFile,"\t%f %f\n",brkint[n].raw,brkint[n].eng);
|
||||
}
|
||||
fprintf(outFile,"}\n");
|
||||
fclose(inFile);
|
||||
fclose(outFile);
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int create_break( struct brkCreateInfo *pbci, brkInt *pabrkInt,
|
||||
int max_breaks, int *n_breaks)
|
||||
{
|
||||
brkInt *pbrkInt;
|
||||
float *table = pbci->pTable;
|
||||
long ntable = pbci->nTable;
|
||||
double ilow,
|
||||
ihigh,
|
||||
tbllow,
|
||||
tblhigh,
|
||||
slope,
|
||||
offset;
|
||||
int ibeg,
|
||||
iend,
|
||||
i,
|
||||
inc,
|
||||
imax,
|
||||
n;
|
||||
double rawBeg,
|
||||
engBeg,
|
||||
rawEnd,
|
||||
engEnd,
|
||||
engCalc,
|
||||
engActual,
|
||||
error;
|
||||
int valid,
|
||||
all_ok,
|
||||
expanding;
|
||||
/* make checks to ensure that brkCreateInfo makes sense */
|
||||
if (pbci->engLow >= pbci->engHigh) {
|
||||
errExit("create_break: engLow >= engHigh");
|
||||
return (-1);
|
||||
}
|
||||
if ((pbci->engLow < pbci->tblEngFirst)
|
||||
|| (pbci->engHigh > pbci->tblEngLast)) {
|
||||
errExit("create_break: engLow > engHigh");
|
||||
return (-1);
|
||||
}
|
||||
if (pbci->tblEngDelta <= 0.0) {
|
||||
errExit("create_break: tblEngDelta <= 0.0");
|
||||
return (-1);
|
||||
}
|
||||
if (ntable < 3) {
|
||||
errExit("raw data must have at least 3 elements");
|
||||
return (-1);
|
||||
}
|
||||
/***************************************************************************
|
||||
Convert Table to raw values
|
||||
*
|
||||
* raw and table values are assumed to be related by an equation of the form:
|
||||
*
|
||||
* raw = slope*table + offset
|
||||
*
|
||||
* The following algorithm converts each table value to raw units
|
||||
*
|
||||
* 1) Finds the locations in Table corresponding to engLow and engHigh
|
||||
* Note that these locations need not be exact integers
|
||||
* 2) Interpolates to obtain table values corresponding to engLow and enghigh
|
||||
* we now have the equations:
|
||||
* rawLow = slope*tblLow + offset
|
||||
* rawHigh = slope*tblHigh + offset
|
||||
* 4) Solving these equations for slope and offset gives:
|
||||
* slope=(rawHigh-rawLow)/(tblHigh-tblLow)
|
||||
* offset=rawHigh-slope*tblHigh
|
||||
* 5) for each table value set table[i]=table[i]*slope+offset
|
||||
*************************************************************************/
|
||||
/* Find engLow in Table and then compute tblLow */
|
||||
ilow = (pbci->engLow - pbci->tblEngFirst) / (pbci->tblEngDelta);
|
||||
i = (int) ilow;
|
||||
if (i >= ntable - 1)
|
||||
i = ntable - 2;
|
||||
tbllow = table[i] + (table[i + 1] - table[i]) * (ilow - (float) i);
|
||||
/* Find engHigh in Table and then compute tblHigh */
|
||||
ihigh = (pbci->engHigh - pbci->tblEngFirst) / (pbci->tblEngDelta);
|
||||
i = (int) ihigh;
|
||||
if (i >= ntable - 1)
|
||||
i = ntable - 2;
|
||||
tblhigh = table[i] + (table[i + 1] - table[i]) * (ihigh - (float) i);
|
||||
/* compute slope and offset */
|
||||
slope = (pbci->rawHigh - pbci->rawLow) / (tblhigh - tbllow);
|
||||
offset = pbci->rawHigh - slope * tblhigh;
|
||||
/* convert table to raw units */
|
||||
for (i = 0; i < ntable; i++)
|
||||
table[i] = table[i] * slope + offset;
|
||||
|
||||
/*****************************************************************************
|
||||
* Now create break point table
|
||||
*
|
||||
* The algorithm does the following:
|
||||
*
|
||||
* It finds one breakpoint interval at a time. For each it does the following:
|
||||
*
|
||||
* 1) Use a relatively large portion of the remaining table as an interval
|
||||
* 2) It attempts to use the entire interval as a breakpoint interval
|
||||
* Success is determined by the following algorithm:
|
||||
* a) compute the slope using the entire interval
|
||||
* b) for each table entry in the interval determine the eng value
|
||||
* using the slope just determined.
|
||||
* c) compare the computed value with eng value associated with table
|
||||
* d) if all table entries are within the accuracy desired then success.
|
||||
* 3) If successful then attempt to expand the interval and try again.
|
||||
* Note that it is expanded by up to 1/10 of the table size.
|
||||
* 4) If not successful reduce the interval by 1 and try again.
|
||||
* Once the interval is being decreased it will never be increased again.
|
||||
* 5) The algorithm will ultimately fail or will have determined the optimum
|
||||
* breakpoint interval
|
||||
*************************************************************************/
|
||||
|
||||
/* Must start with table entry corresponding to engLow; */
|
||||
i = ilow;
|
||||
if (i >= ntable - 1)
|
||||
i = ntable - 2;
|
||||
rawBeg = table[i] + (table[i + 1] - table[i]) * (ilow - (float) i);
|
||||
engBeg = pbci->engLow;
|
||||
ibeg = (int) (ilow); /* Make sure that ibeg > ilow */
|
||||
if( ibeg < ilow ) ibeg = ibeg + 1;
|
||||
/* start first breakpoint interval */
|
||||
n = 1;
|
||||
pbrkInt = pabrkInt;
|
||||
pbrkInt->raw = rawBeg;
|
||||
pbrkInt->eng = engBeg;
|
||||
/* determine next breakpoint interval */
|
||||
while ((engBeg <= pbci->engHigh) && (ibeg < ntable - 1)) {
|
||||
/* determine next interval to try. Up to 1/10 full range */
|
||||
iend = ibeg;
|
||||
inc = (int) ((ihigh - ilow) / 10.0);
|
||||
if (inc < 1)
|
||||
inc = 1;
|
||||
valid = TRUE;
|
||||
/* keep trying intervals until cant do better */
|
||||
expanding = TRUE; /* originally we are trying larger and larger
|
||||
* intervals */
|
||||
while (valid) {
|
||||
imax = iend + inc;
|
||||
if (imax >= ntable) {
|
||||
/* don't go past end of table */
|
||||
imax = ntable - 1;
|
||||
inc = ntable - iend - 1;
|
||||
expanding = FALSE;
|
||||
}
|
||||
if (imax > (int) (ihigh + 1.0)) { /* Don't go to far past
|
||||
* engHigh */
|
||||
imax = (int) (ihigh + 1.0);
|
||||
inc = (int) (ihigh + 1.0) - iend;
|
||||
expanding = FALSE;
|
||||
}
|
||||
if (imax <= ibeg)
|
||||
break; /* failure */
|
||||
rawEnd = table[imax];
|
||||
engEnd = pbci->tblEngFirst + (float) imax *(pbci->tblEngDelta);
|
||||
slope = (engEnd - engBeg) / (rawEnd - rawBeg);
|
||||
all_ok = TRUE;
|
||||
for (i = ibeg + 1; i <= imax; i++) {
|
||||
engCalc = engBeg + slope * (table[i] - rawBeg);
|
||||
engActual = pbci->tblEngFirst + ((float) i) * (pbci->tblEngDelta);
|
||||
error = engCalc - engActual;
|
||||
if (error < 0.0)
|
||||
error = -error;
|
||||
if (error >= pbci->accuracy) {
|
||||
/* we will be trying smaller intervals */
|
||||
expanding = FALSE;
|
||||
/* just decrease inc and let while(valid) try again */
|
||||
inc--;
|
||||
all_ok = FALSE;
|
||||
break;
|
||||
}
|
||||
} /* end for */
|
||||
if (all_ok) {
|
||||
iend = imax;
|
||||
/* if not expanding we found interval */
|
||||
if (!expanding)
|
||||
break;
|
||||
/* will automatically try larger interval */
|
||||
}
|
||||
} /* end while(valid) */
|
||||
/* either we failed or optimal interval has been found */
|
||||
if ((iend <= ibeg) && (iend < (int) ihigh)) {
|
||||
errExit("Could not meet accuracy criteria");
|
||||
return (-1);
|
||||
}
|
||||
pbrkInt->slope = slope;
|
||||
/* get ready for next breakpoint interval */
|
||||
if (n++ >= max_breaks) {
|
||||
errExit("Break point table too large");
|
||||
return (-1);
|
||||
}
|
||||
ibeg = iend;
|
||||
pbrkInt++;
|
||||
rawBeg = rawEnd;
|
||||
engBeg = engEnd;
|
||||
pbrkInt->raw = rawBeg;
|
||||
pbrkInt->eng = engBeg + (pbrkInt->raw - rawBeg) * slope;
|
||||
}
|
||||
pbrkInt->slope = 0.0;
|
||||
*n_breaks = n;
|
||||
return (0);
|
||||
}
|
||||
16
src/bpt/menuConvert.ascii
Normal file
16
src/bpt/menuConvert.ascii
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")
|
||||
}
|
||||
@@ -5,11 +5,10 @@ $!
|
||||
$! Purpose : To build the CHANNEL_ACCESS library and test programs for
|
||||
$! VAX/VMS. This procedure assumes the following:
|
||||
$! - You have copied *.c and *.h from the Epics channel access
|
||||
$! source directory (.../src/ca) into this VMS directory
|
||||
$! - You have copied envSubr.c, ellLib.c, and bucketLib.c
|
||||
$! from the Epics
|
||||
$! source directory (base/src/ca) into this VMS directory
|
||||
$! - You have copied *.c and *.h from the Epics
|
||||
$! libCom directory into this VMS directory
|
||||
$! - You have copied *.h from the /src/epicsH directory into this
|
||||
$! - You have copied *.h from the base/include directory into this
|
||||
$! VMS directory
|
||||
$! - You are using Multinet for TCP/IP access. If not, the logical
|
||||
$! name definitions below will need to be changed
|
||||
@@ -24,7 +23,7 @@ $!
|
||||
$!========================================================================
|
||||
$!
|
||||
$! Example FTP script moves sources from UNIX to VMS
|
||||
$! (remove "$!" comment delimeters)
|
||||
$! (remove "$!" comment delimiters)
|
||||
$!
|
||||
$! user XXXXXXX
|
||||
$! cd [.ca]
|
||||
@@ -36,7 +35,9 @@ $! put BUILD_VMS.COM
|
||||
$! lcd ../libCom
|
||||
$! mput *.c
|
||||
$! mput *.h
|
||||
$! lcd ../../include
|
||||
$! lcd O.sun4
|
||||
$! mput envData.c
|
||||
$! lcd ../../../include
|
||||
$! mput *.h
|
||||
$!========================================================================
|
||||
$!
|
||||
@@ -74,6 +75,7 @@ ENVSUBR, -
|
||||
TSSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
ASSERTUNIX, -
|
||||
ENVDATA, -
|
||||
CATIME, -
|
||||
ACCTST
|
||||
$ endif
|
||||
@@ -97,6 +99,7 @@ BUCKETLIB, -
|
||||
TSSUBR, -
|
||||
ENVSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
ENVDATA, -
|
||||
ASSERTUNIX, -
|
||||
ELLLIB
|
||||
$! Link the test programs
|
||||
|
||||
@@ -34,13 +34,7 @@ include $(EPICS)/config/RULES.Unix
|
||||
acctst: acctst.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
acctst.o: ../acctst.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
catime: catime.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
catime.o: ../catime.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
|
||||
|
||||
@@ -8,21 +8,11 @@ SRCS.c = \
|
||||
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c \
|
||||
../catime.c
|
||||
|
||||
OBJS = \
|
||||
LIBOBJS = \
|
||||
iocinf.o access.o test_event.o service.o flow_control.o \
|
||||
repeater.o conn.o syncgrp.o if_depen.o bsd_depen.o vxWorks_depen.o
|
||||
|
||||
PROD = caLib
|
||||
LIBNAME = caLib
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
caLib: $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
acctst.o: ../acctst.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
catime.o: ../catime.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
|
||||
379
src/ca/access.c
379
src/ca/access.c
@@ -1,3 +1,4 @@
|
||||
/* $Id$ */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
@@ -92,7 +93,44 @@
|
||||
/* 011394 joh fixed bucketLib level memory leak (vxWorks) */
|
||||
/* 020494 joh Added user name protocol */
|
||||
/* 022294 joh fixed recv task id verify at exit (vxWorks) */
|
||||
/* */
|
||||
/* 072895 joh fixed problem resulting from unsigned long */
|
||||
/* tv_sec var in struct timeval in sys/time.h */
|
||||
/* under HPUX */
|
||||
/************************************************************************/
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.79 1995/10/12 01:30:10 jhill
|
||||
* new ca_flush_io() mechanism prevents deadlock when they call
|
||||
* ca_flush_io() from within an event routine. Also forces early
|
||||
* transmission of leading search UDP frames.
|
||||
*
|
||||
* Revision 1.78 1995/09/29 21:47:33 jhill
|
||||
* alignment fix for SPARC IOC client and changes to prevent running of
|
||||
* access rights or connection handlers when the connection is lost just
|
||||
* after deleting a channel
|
||||
*
|
||||
* Revision 1.77 1995/09/01 14:31:32 mrk
|
||||
* Fixed bug causing memory problem
|
||||
*
|
||||
* Revision 1.76 1995/08/23 00:34:06 jhill
|
||||
* fixed vxWorks specific SPARC data alignment problem
|
||||
*
|
||||
* Revision 1.75 1995/08/22 00:15:19 jhill
|
||||
* Use 1.0/USEC_PER_SEC and not 1.0e-6
|
||||
* Check for S_db_Pending when calling dbPutNotify()
|
||||
*
|
||||
* Revision 1.74 1995/08/22 00:12:07 jhill
|
||||
* *** empty log message ***
|
||||
*
|
||||
* Revision 1.73 1995/08/14 19:26:10 jhill
|
||||
* epicsAPI => epicsShareAPI
|
||||
*
|
||||
* Revision 1.72 1995/08/12 00:23:32 jhill
|
||||
* check for res id in use, epicsEntry, dont wait for itsy bitsy delay
|
||||
* in ca_pend_event(), better clean up when monitor is deleted and
|
||||
* we are disconnected
|
||||
*
|
||||
*/
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -292,6 +330,22 @@ void *pext
|
||||
while(TRUE){
|
||||
struct timeval itimeout;
|
||||
|
||||
/*
|
||||
* record the time if we end up blocking so that
|
||||
* we can time out
|
||||
*/
|
||||
if (bytesAvailable>=msgsize){
|
||||
piiu->sendPending = FALSE;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (!piiu->sendPending) {
|
||||
piiu->timeAtSendBlock =
|
||||
ca_static->currentTime;
|
||||
piiu->sendPending = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* if connection drops request
|
||||
* cant be completed
|
||||
@@ -311,21 +365,6 @@ void *pext
|
||||
bytesAvailable = cacRingBufferWriteSize(
|
||||
&piiu->send,
|
||||
FALSE);
|
||||
/*
|
||||
* record the time if we end up blocking so that
|
||||
* we can time out
|
||||
*/
|
||||
if (bytesAvailable>=extsize+sizeof(msg)) {
|
||||
piiu->sendPending = FALSE;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (!piiu->sendPending) {
|
||||
piiu->timeAtSendBlock =
|
||||
ca_static->currentTime;
|
||||
piiu->sendPending = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -443,7 +482,7 @@ LOCAL void cac_add_msg (IIU *piiu)
|
||||
/*
|
||||
* CA_TASK_INITIALIZE
|
||||
*/
|
||||
int APIENTRY ca_task_initialize(void)
|
||||
int epicsShareAPI ca_task_initialize(void)
|
||||
{
|
||||
int status;
|
||||
struct ca_static *ca_temp;
|
||||
@@ -548,6 +587,8 @@ int ca_os_independent_init (void)
|
||||
ca_spawn_repeater();
|
||||
}
|
||||
|
||||
ca_static->ca_flush_pending = FALSE;
|
||||
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
@@ -566,6 +607,7 @@ LOCAL void create_udp_fd()
|
||||
status = create_net_chan(
|
||||
&ca_static->ca_piiuCast,
|
||||
NULL,
|
||||
ca_static->ca_server_port,
|
||||
IPPROTO_UDP);
|
||||
if (~status & CA_M_SUCCESS) {
|
||||
ca_static->ca_piiuCast = NULL;
|
||||
@@ -589,7 +631,7 @@ LOCAL void create_udp_fd()
|
||||
|
||||
status = taskSpawn(
|
||||
name,
|
||||
pri-1,
|
||||
pri+1,
|
||||
VX_FP_TASK,
|
||||
4096,
|
||||
(FUNCPTR)cac_recv_task,
|
||||
@@ -620,7 +662,7 @@ LOCAL void create_udp_fd()
|
||||
* Modify or override the default
|
||||
* client host name.
|
||||
*/
|
||||
int APIENTRY ca_modify_host_name(char *pHostName)
|
||||
int epicsShareAPI ca_modify_host_name(char *pHostName)
|
||||
{
|
||||
char *pTmp;
|
||||
unsigned size;
|
||||
@@ -675,7 +717,7 @@ int APIENTRY ca_modify_host_name(char *pHostName)
|
||||
* Modify or override the default
|
||||
* client user name.
|
||||
*/
|
||||
int APIENTRY ca_modify_user_name(char *pClientName)
|
||||
int epicsShareAPI ca_modify_user_name(char *pClientName)
|
||||
{
|
||||
char *pTmp;
|
||||
unsigned size;
|
||||
@@ -730,7 +772,7 @@ int APIENTRY ca_modify_user_name(char *pClientName)
|
||||
* call this routine if you wish to free resources prior to task
|
||||
* exit- ca_task_exit() is also executed routinely at task exit.
|
||||
*/
|
||||
int APIENTRY ca_task_exit (void)
|
||||
int epicsShareAPI ca_task_exit (void)
|
||||
{
|
||||
/*
|
||||
* This indirectly calls ca_process_exit() below
|
||||
@@ -858,10 +900,10 @@ void ca_process_exit()
|
||||
/*
|
||||
* free hash tables
|
||||
*/
|
||||
status = bucketFree(ca_static->ca_pSlowBucket);
|
||||
assert(status == BUCKET_SUCCESS);
|
||||
status = bucketFree(ca_static->ca_pFastBucket);
|
||||
assert(status == BUCKET_SUCCESS);
|
||||
status = bucketFree (ca_static->ca_pSlowBucket);
|
||||
assert (status == S_bucket_success);
|
||||
status = bucketFree (ca_static->ca_pFastBucket);
|
||||
assert (status == S_bucket_success);
|
||||
|
||||
/*
|
||||
* free beacon hash table
|
||||
@@ -880,7 +922,7 @@ void ca_process_exit()
|
||||
*
|
||||
* backwards compatible entry point to ca_search_and_connect()
|
||||
*/
|
||||
int APIENTRY ca_build_and_connect
|
||||
int epicsShareAPI ca_build_and_connect
|
||||
(
|
||||
char *name_str,
|
||||
chtype get_type,
|
||||
@@ -905,7 +947,7 @@ int APIENTRY ca_build_and_connect
|
||||
*
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_search_and_connect
|
||||
int epicsShareAPI ca_search_and_connect
|
||||
(
|
||||
char *name_str,
|
||||
chid *chixptr,
|
||||
@@ -950,13 +992,14 @@ int APIENTRY ca_search_and_connect
|
||||
* also allocate enough for the channel name & paddr
|
||||
* block
|
||||
*/
|
||||
size = sizeof(*chix) + strcnt + sizeof(struct db_addr);
|
||||
size = CA_MESSAGE_ALIGN(sizeof(*chix) + strcnt) +
|
||||
sizeof(struct db_addr);
|
||||
*chixptr = chix = (chid) calloc(1,size);
|
||||
if (!chix){
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
chix->id.paddr = (struct db_addr *)
|
||||
(strcnt + (char *) (chix + 1));
|
||||
(CA_MESSAGE_ALIGN(sizeof(*chix)+strcnt) + (char *)chix);
|
||||
*chix->id.paddr = tmp_paddr;
|
||||
chix->puser = puser;
|
||||
chix->pConnFunc = conn_func;
|
||||
@@ -1010,13 +1053,20 @@ int APIENTRY ca_search_and_connect
|
||||
}
|
||||
|
||||
LOCK;
|
||||
chix->cid = CLIENT_SLOW_ID_ALLOC;
|
||||
status = bucketAddItemUnsignedId(pSlowBucket, &chix->cid, chix);
|
||||
if(status != BUCKET_SUCCESS){
|
||||
do {
|
||||
chix->cid = CLIENT_SLOW_ID_ALLOC;
|
||||
status = bucketAddItemUnsignedId (pSlowBucket,
|
||||
&chix->cid, chix);
|
||||
} while (status == S_bucket_idInUse);
|
||||
|
||||
if (status != S_bucket_success) {
|
||||
*chixptr = (chid) NULL;
|
||||
free((char *) chix);
|
||||
UNLOCK;
|
||||
return ECA_ALLOCMEM;
|
||||
if (status == S_bucket_noMemory) {
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
return ECA_INTERNAL;
|
||||
}
|
||||
|
||||
chix->puser = puser;
|
||||
@@ -1127,7 +1177,7 @@ int reply_type
|
||||
*
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_array_get
|
||||
int epicsShareAPI ca_array_get
|
||||
(
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -1195,8 +1245,10 @@ void *pvalue
|
||||
}
|
||||
else {
|
||||
LOCK;
|
||||
ellDelete (&pend_read_list, &monix->node);
|
||||
caIOBlockFree (monix);
|
||||
if (ca_state(chix)==cs_conn) {
|
||||
ellDelete (&pend_read_list, &monix->node);
|
||||
caIOBlockFree (monix);
|
||||
}
|
||||
UNLOCK;
|
||||
}
|
||||
}
|
||||
@@ -1212,7 +1264,7 @@ void *pvalue
|
||||
/*
|
||||
* CA_ARRAY_GET_CALLBACK()
|
||||
*/
|
||||
int APIENTRY ca_array_get_callback
|
||||
int epicsShareAPI ca_array_get_callback
|
||||
(
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -1273,8 +1325,10 @@ void *arg
|
||||
status = issue_get_callback (monix, IOC_READ_NOTIFY);
|
||||
if (status != ECA_NORMAL) {
|
||||
LOCK;
|
||||
ellDelete (&pend_read_list, &monix->node);
|
||||
caIOBlockFree (monix);
|
||||
if (ca_state(chix)==cs_conn) {
|
||||
ellDelete (&pend_read_list, &monix->node);
|
||||
caIOBlockFree (monix);
|
||||
}
|
||||
UNLOCK;
|
||||
}
|
||||
}
|
||||
@@ -1305,12 +1359,15 @@ LOCAL evid caIOBlockCreate(void)
|
||||
}
|
||||
|
||||
if (pIOBlock) {
|
||||
pIOBlock->id = CLIENT_FAST_ID_ALLOC;
|
||||
status = bucketAddItemUnsignedId(
|
||||
pFastBucket,
|
||||
&pIOBlock->id,
|
||||
pIOBlock);
|
||||
if(status != BUCKET_SUCCESS){
|
||||
do {
|
||||
pIOBlock->id = CLIENT_FAST_ID_ALLOC;
|
||||
status = bucketAddItemUnsignedId(
|
||||
pFastBucket,
|
||||
&pIOBlock->id,
|
||||
pIOBlock);
|
||||
} while (status == S_bucket_idInUse);
|
||||
|
||||
if(status != S_bucket_success){
|
||||
free(pIOBlock);
|
||||
pIOBlock = NULL;
|
||||
}
|
||||
@@ -1333,7 +1390,7 @@ void caIOBlockFree(evid pIOBlock)
|
||||
status = bucketRemoveItemUnsignedId(
|
||||
ca_static->ca_pFastBucket,
|
||||
&pIOBlock->id);
|
||||
assert (status == BUCKET_SUCCESS);
|
||||
assert (status == S_bucket_success);
|
||||
pIOBlock->id = ~0U; /* this id always invalid */
|
||||
ellAdd (&free_event_list, &pIOBlock->node);
|
||||
UNLOCK;
|
||||
@@ -1433,7 +1490,7 @@ LOCAL int issue_get_callback(evid monix, unsigned cmmd)
|
||||
* CA_ARRAY_PUT_CALLBACK()
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_array_put_callback
|
||||
int epicsShareAPI ca_array_put_callback
|
||||
(
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -1537,7 +1594,7 @@ void *usrarg
|
||||
}
|
||||
status = dbPutNotify(&ppn->dbPutNotify);
|
||||
UNLOCK;
|
||||
if(status){
|
||||
if(status && status != S_db_Pending){
|
||||
if(status==S_db_Blocked){
|
||||
return ECA_PUTCBINPROG;
|
||||
}
|
||||
@@ -1577,8 +1634,10 @@ void *usrarg
|
||||
pvalue);
|
||||
if(status != ECA_NORMAL){
|
||||
LOCK;
|
||||
ellDelete (&pend_write_list, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
if (ca_state(chix)==cs_conn) {
|
||||
ellDelete (&pend_write_list, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
}
|
||||
UNLOCK;
|
||||
return status;
|
||||
}
|
||||
@@ -1642,7 +1701,7 @@ LOCAL void ca_put_notify_action(PUTNOTIFY *ppn)
|
||||
*
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_array_put (
|
||||
int epicsShareAPI ca_array_put (
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
chid chix,
|
||||
@@ -1883,7 +1942,7 @@ LOCAL void free_put_convert(void *pBuf)
|
||||
* Specify an event subroutine to be run for connection events
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_change_connection_event
|
||||
int epicsShareAPI ca_change_connection_event
|
||||
(
|
||||
chid chix,
|
||||
void (*pfunc)(struct connection_handler_args)
|
||||
@@ -1915,7 +1974,7 @@ void (*pfunc)(struct connection_handler_args)
|
||||
/*
|
||||
* ca_replace_access_rights_event
|
||||
*/
|
||||
int APIENTRY ca_replace_access_rights_event(
|
||||
int epicsShareAPI ca_replace_access_rights_event(
|
||||
chid chan,
|
||||
void (*pfunc)(struct access_rights_handler_args))
|
||||
{
|
||||
@@ -1929,7 +1988,7 @@ void (*pfunc)(struct access_rights_handler_args))
|
||||
/*
|
||||
* make certain that it runs at least once
|
||||
*/
|
||||
if(chan->state == cs_conn){
|
||||
if(chan->state == cs_conn && chan->pAccessRightsFunc){
|
||||
args.chid = chan;
|
||||
args.ar = chan->ar;
|
||||
(*chan->pAccessRightsFunc)(args);
|
||||
@@ -1943,7 +2002,7 @@ void (*pfunc)(struct access_rights_handler_args))
|
||||
* Specify an event subroutine to be run for asynch exceptions
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_add_exception_event
|
||||
int epicsShareAPI ca_add_exception_event
|
||||
(
|
||||
void (*pfunc)(struct exception_handler_args),
|
||||
void *arg
|
||||
@@ -1975,7 +2034,7 @@ void *arg
|
||||
* Undocumented entry for the VAX OPI which may vanish in the future.
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_add_io_event
|
||||
int epicsShareAPI ca_add_io_event
|
||||
(
|
||||
void (*ast)(),
|
||||
void *astarg
|
||||
@@ -2010,7 +2069,7 @@ void *astarg
|
||||
*
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_add_masked_array_event
|
||||
int epicsShareAPI ca_add_masked_array_event
|
||||
(
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -2140,8 +2199,10 @@ long mask
|
||||
status = ca_request_event(monix);
|
||||
if (status != ECA_NORMAL) {
|
||||
LOCK;
|
||||
ellDelete (&chix->eventq, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
if (ca_state(chix)==cs_conn) {
|
||||
ellDelete (&chix->eventq, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
}
|
||||
UNLOCK
|
||||
}
|
||||
return status;
|
||||
@@ -2373,7 +2434,7 @@ void *pfl
|
||||
* after leaving this routine.
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_clear_event (evid monix)
|
||||
int epicsShareAPI ca_clear_event (evid monix)
|
||||
{
|
||||
int status;
|
||||
chid chix = monix->chan;
|
||||
@@ -2448,6 +2509,7 @@ int APIENTRY ca_clear_event (evid monix)
|
||||
else{
|
||||
LOCK;
|
||||
ellDelete(&monix->chan->eventq, &monix->node);
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
status = ECA_NORMAL;
|
||||
}
|
||||
@@ -2471,7 +2533,7 @@ int APIENTRY ca_clear_event (evid monix)
|
||||
* (from this source) after leaving this routine.
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_clear_channel (chid chix)
|
||||
int epicsShareAPI ca_clear_channel (chid chix)
|
||||
{
|
||||
int status;
|
||||
evid monix;
|
||||
@@ -2485,6 +2547,8 @@ int APIENTRY ca_clear_channel (chid chix)
|
||||
chix->type = TYPENOTINUSE;
|
||||
old_chan_state = chix->state;
|
||||
chix->state = cs_closed;
|
||||
chix->pAccessRightsFunc = NULL;
|
||||
chix->pConnFunc = NULL;
|
||||
|
||||
/* the while is only so I can break to the lock exit */
|
||||
LOCK;
|
||||
@@ -2614,7 +2678,7 @@ void clearChannelResources(unsigned id)
|
||||
ellDelete (&piiu->chidlist, &chix->node);
|
||||
status = bucketRemoveItemUnsignedId (
|
||||
ca_static->ca_pSlowBucket, &chix->cid);
|
||||
assert (status == BUCKET_SUCCESS);
|
||||
assert (status == S_bucket_success);
|
||||
free (chix);
|
||||
if (piiu!=piiuCast && !piiu->chidlist.count){
|
||||
TAG_CONN_DOWN(piiu);
|
||||
@@ -2631,48 +2695,59 @@ void clearChannelResources(unsigned id)
|
||||
/* if the argument early is specified TRUE then CA_NORMAL is */
|
||||
/* returned early (prior to timeout experation) when outstanding */
|
||||
/* IO completes. */
|
||||
/* ca_flush_io() is called by this routine. */
|
||||
/* Output buffers are flushed by this routine */
|
||||
/************************************************************************/
|
||||
int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
int epicsShareAPI ca_pend (ca_real timeout, int early)
|
||||
{
|
||||
struct timeval beg_time;
|
||||
ca_real delay;
|
||||
struct timeval tmo;
|
||||
|
||||
INITCHK;
|
||||
|
||||
if(timeout<0.0){
|
||||
return ECA_TIMEOUT;
|
||||
}
|
||||
|
||||
if(EVENTLOCKTEST){
|
||||
return ECA_EVDISALLOW;
|
||||
}
|
||||
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
|
||||
/*
|
||||
* Flush the send buffers
|
||||
* (guarantees that we wait for all send buffer to be
|
||||
* flushed even if this requires blocking)
|
||||
*
|
||||
* Also takes care of outstanding recvs
|
||||
* for single threaded clients
|
||||
*/
|
||||
ca_flush_io();
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
|
||||
if(pndrecvcnt<1 && early){
|
||||
/*
|
||||
* force the flush
|
||||
*/
|
||||
LD_CA_TIME (0.0, &tmo);
|
||||
cac_mux_io(&tmo);
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* the current time set iderectly within ca_flush_io()
|
||||
* above.
|
||||
*/
|
||||
if(timeout<0.0){
|
||||
/*
|
||||
* force the flush
|
||||
*/
|
||||
LD_CA_TIME (0.0, &tmo);
|
||||
cac_mux_io(&tmo);
|
||||
return ECA_TIMEOUT;
|
||||
}
|
||||
|
||||
beg_time = ca_static->currentTime;
|
||||
delay = 0.0;
|
||||
while(TRUE){
|
||||
ca_real remaining;
|
||||
struct timeval tmo;
|
||||
|
||||
if (pndrecvcnt<1 && early) {
|
||||
/*
|
||||
* force the flush
|
||||
*/
|
||||
LD_CA_TIME (0.0, &tmo);
|
||||
cac_mux_io(&tmo);
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
@@ -2681,29 +2756,48 @@ int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
}
|
||||
else{
|
||||
remaining = timeout-delay;
|
||||
if(remaining<=0.0){
|
||||
if(early){
|
||||
ca_pend_io_cleanup();
|
||||
}
|
||||
ca_flush_io();
|
||||
return ECA_TIMEOUT;
|
||||
}
|
||||
/*
|
||||
* Allow for CA background labor
|
||||
*/
|
||||
remaining = min(SELECT_POLL, remaining);
|
||||
}
|
||||
|
||||
tmo.tv_sec = (long) remaining;
|
||||
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
|
||||
cac_block_for_io_completion(&tmo);
|
||||
|
||||
/*
|
||||
* the current time set within cac_block_for_io_completion()
|
||||
* above.
|
||||
* If we are no longer waiting any significant
|
||||
* delay then return
|
||||
* (dont wait forever for an itsy bitsy
|
||||
* delay which will no be updated if
|
||||
* select is called with no delay)
|
||||
*
|
||||
* current time is only updated by
|
||||
* cac_select_io() if we specify
|
||||
* at least 1 usec to wait
|
||||
*
|
||||
*/
|
||||
if (remaining <= (1.0/USEC_PER_SEC)) {
|
||||
if(early){
|
||||
ca_pend_io_cleanup();
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
}
|
||||
/*
|
||||
* be certain that we processed
|
||||
* recv backlog at least once
|
||||
*/
|
||||
/*
|
||||
* force the flush
|
||||
*/
|
||||
LD_CA_TIME (0.0, &tmo);
|
||||
cac_block_for_io_completion (&tmo);
|
||||
return ECA_TIMEOUT;
|
||||
}
|
||||
tmo.tv_sec = (long) remaining;
|
||||
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
|
||||
cac_block_for_io_completion (&tmo);
|
||||
|
||||
if (timeout != 0.0) {
|
||||
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
|
||||
delay = cac_time_diff (&ca_static->currentTime,
|
||||
&beg_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2714,20 +2808,31 @@ int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
*/
|
||||
ca_real cac_time_diff (ca_time *pTVA, ca_time *pTVB)
|
||||
{
|
||||
ca_real delay;
|
||||
ca_real delay;
|
||||
ca_real udelay;
|
||||
|
||||
if(pTVA->tv_usec>pTVB->tv_usec){
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec;
|
||||
delay += (pTVA->tv_usec - pTVB->tv_usec) /
|
||||
(ca_real)(USEC_PER_SEC);
|
||||
}
|
||||
else{
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec - 1L;
|
||||
delay += (USEC_PER_SEC - pTVB->tv_usec + pTVA->tv_usec) /
|
||||
(ca_real)(USEC_PER_SEC);
|
||||
}
|
||||
/*
|
||||
* works with unsigned tv_sec in struct timeval
|
||||
* under HPUX
|
||||
*/
|
||||
if (pTVA->tv_sec>pTVB->tv_sec) {
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec;
|
||||
}
|
||||
else {
|
||||
delay = pTVB->tv_sec - pTVA->tv_sec;
|
||||
delay = -delay;
|
||||
}
|
||||
|
||||
return delay;
|
||||
if(pTVA->tv_usec>pTVB->tv_usec){
|
||||
udelay = pTVA->tv_usec - pTVB->tv_usec;
|
||||
}
|
||||
else{
|
||||
delay -= 1.0;
|
||||
udelay = (USEC_PER_SEC - pTVB->tv_usec) + pTVA->tv_usec;
|
||||
}
|
||||
delay += udelay / USEC_PER_SEC;
|
||||
|
||||
return delay;
|
||||
}
|
||||
|
||||
|
||||
@@ -2790,55 +2895,27 @@ LOCAL void ca_pend_io_cleanup()
|
||||
|
||||
/*
|
||||
* CA_FLUSH_IO()
|
||||
*
|
||||
* Flush the send buffer
|
||||
*
|
||||
* reprocess connection state and
|
||||
* flush the send buffer
|
||||
*/
|
||||
int APIENTRY ca_flush_io()
|
||||
int epicsShareAPI ca_flush_io()
|
||||
{
|
||||
struct ioc_in_use *piiu;
|
||||
struct timeval timeout;
|
||||
int pending;
|
||||
unsigned long bytesPending;
|
||||
|
||||
INITCHK;
|
||||
|
||||
pending = TRUE;
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 0;
|
||||
while(pending){
|
||||
/*
|
||||
* force early transmission of the first few search frames
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
/*
|
||||
* perform socket io
|
||||
* and process recv backlog
|
||||
*/
|
||||
cac_mux_io(&timeout);
|
||||
|
||||
/*
|
||||
* wait for all buffers to flush
|
||||
*/
|
||||
pending = FALSE;
|
||||
LOCK;
|
||||
for( piiu = (IIU *) iiuList.node.next;
|
||||
piiu;
|
||||
piiu = (IIU *) piiu->node.next){
|
||||
|
||||
if(piiu == piiuCast || piiu->conn_up == FALSE){
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
bytesPending = cacRingBufferReadSize(
|
||||
&piiu->send,
|
||||
FALSE);
|
||||
if(bytesPending != 0){
|
||||
pending = TRUE;
|
||||
}
|
||||
}
|
||||
UNLOCK;
|
||||
|
||||
LD_CA_TIME (SELECT_POLL, &timeout);
|
||||
}
|
||||
/*
|
||||
* Wait for all send buffers to be flushed
|
||||
* while performing socket io and processing recv backlog
|
||||
*/
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
LD_CA_TIME (0.0, &timeout);
|
||||
cac_mux_io (&timeout);
|
||||
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
@@ -2848,7 +2925,7 @@ int APIENTRY ca_flush_io()
|
||||
* CA_TEST_IO ()
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_test_io()
|
||||
int epicsShareAPI ca_test_io()
|
||||
{
|
||||
if(pndrecvcnt<1){
|
||||
return ECA_IODONE;
|
||||
@@ -2864,7 +2941,7 @@ int APIENTRY ca_test_io()
|
||||
*
|
||||
*
|
||||
*/
|
||||
void APIENTRY ca_signal(long ca_status,char *message)
|
||||
void epicsShareAPI ca_signal(long ca_status,char *message)
|
||||
{
|
||||
ca_signal_with_file_and_lineno(ca_status, message, NULL, 0);
|
||||
}
|
||||
@@ -2873,7 +2950,7 @@ void APIENTRY ca_signal(long ca_status,char *message)
|
||||
/*
|
||||
* ca_signal_with_file_and_lineno()
|
||||
*/
|
||||
void APIENTRY ca_signal_with_file_and_lineno(
|
||||
void epicsShareAPI ca_signal_with_file_and_lineno(
|
||||
long ca_status,
|
||||
char *message,
|
||||
char *pfilenm,
|
||||
@@ -3236,7 +3313,7 @@ LOCAL void ca_default_exception_handler(struct exception_handler_args args)
|
||||
* (for a manager of the select system call under UNIX)
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_add_fd_registration(CAFDHANDLER *func, void *arg)
|
||||
int epicsShareAPI ca_add_fd_registration(CAFDHANDLER *func, void *arg)
|
||||
{
|
||||
fd_register_func = func;
|
||||
fd_register_arg = arg;
|
||||
@@ -3267,7 +3344,7 @@ int ca_defunct()
|
||||
* currently implemented as a function
|
||||
* (may be implemented as a MACRO in the future)
|
||||
*/
|
||||
char * APIENTRY ca_host_name_function(chid chix)
|
||||
char * epicsShareAPI ca_host_name_function(chid chix)
|
||||
{
|
||||
IIU *piiu;
|
||||
|
||||
@@ -3283,7 +3360,7 @@ char * APIENTRY ca_host_name_function(chid chix)
|
||||
/*
|
||||
* ca_v42_ok(chid chan)
|
||||
*/
|
||||
int APIENTRY ca_v42_ok(chid chan)
|
||||
int epicsShareAPI ca_v42_ok(chid chan)
|
||||
{
|
||||
int v42;
|
||||
IIU *piiu;
|
||||
@@ -3360,10 +3437,12 @@ int ca_channel_status(int tid)
|
||||
/*
|
||||
* ca_replace_printf_handler ()
|
||||
*/
|
||||
int APIENTRY ca_replace_printf_handler (
|
||||
int epicsShareAPI ca_replace_printf_handler (
|
||||
int (*ca_printf_func)(const char *pformat, va_list args)
|
||||
)
|
||||
{
|
||||
INITCHK;
|
||||
|
||||
if (ca_printf_func) {
|
||||
ca_static->ca_printf_func = ca_printf_func;
|
||||
}
|
||||
|
||||
283
src/ca/acctst.c
283
src/ca/acctst.c
@@ -5,6 +5,19 @@
|
||||
|
||||
static char *sccsId = "@(#) $Id$";
|
||||
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.31 1995/10/12 01:30:28 jhill
|
||||
* improved the test
|
||||
*
|
||||
* Revision 1.30 1995/09/29 21:47:58 jhill
|
||||
* MS windows changes
|
||||
*
|
||||
* Revision 1.29 1995/08/22 00:16:34 jhill
|
||||
* Added test of the duration of ca_pend_event()
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef VMS
|
||||
#include <LIB$ROUTINES.H>
|
||||
#endif
|
||||
@@ -19,7 +32,7 @@ static char *sccsId = "@(#) $Id$";
|
||||
|
||||
#include "os_depen.h"
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <assert.h>
|
||||
#include <cadef.h>
|
||||
|
||||
#define EVENT_ROUTINE null_event
|
||||
@@ -27,7 +40,11 @@ static char *sccsId = "@(#) $Id$";
|
||||
|
||||
#define NUM 1
|
||||
|
||||
int conn_get_cb_count;
|
||||
int conn_cb_count;
|
||||
|
||||
#ifndef min
|
||||
#define min(A,B) ((A)>(B)?(B):(A))
|
||||
#endif
|
||||
|
||||
int doacctst(char *pname);
|
||||
void test_sync_groups(chid chix);
|
||||
@@ -35,9 +52,22 @@ void multiple_sg_requests(chid chix, CA_SYNC_GID gid);
|
||||
void null_event(struct event_handler_args args);
|
||||
void write_event(struct event_handler_args args);
|
||||
void conn(struct connection_handler_args args);
|
||||
void conn_cb(struct event_handler_args args);
|
||||
void get_cb(struct event_handler_args args);
|
||||
void accessSecurity_cb(struct access_rights_handler_args args);
|
||||
|
||||
void doubleTest(
|
||||
chid chan,
|
||||
dbr_double_t beginValue,
|
||||
dbr_double_t increment,
|
||||
dbr_double_t epsilon,
|
||||
unsigned iterations);
|
||||
|
||||
void floatTest(
|
||||
chid chan,
|
||||
dbr_float_t beginValue,
|
||||
dbr_float_t increment,
|
||||
dbr_float_t epsilon,
|
||||
unsigned iterations);
|
||||
|
||||
#ifdef vxWorks
|
||||
int acctst(char *pname)
|
||||
@@ -82,25 +112,45 @@ int doacctst(char *pname)
|
||||
chid chix4;
|
||||
struct dbr_gr_float *ptr = NULL;
|
||||
struct dbr_gr_float *pgrfloat = NULL;
|
||||
float *pfloat = NULL;
|
||||
double *pdouble = NULL;
|
||||
dbr_float_t *pfloat = NULL;
|
||||
dbr_double_t *pdouble = NULL;
|
||||
long status;
|
||||
long i, j;
|
||||
evid monix;
|
||||
char pstring[NUM][MAX_STRING_SIZE];
|
||||
|
||||
unsigned size;
|
||||
|
||||
SEVCHK(ca_task_initialize(), "Unable to initialize");
|
||||
|
||||
conn_get_cb_count = 0;
|
||||
conn_cb_count = 0;
|
||||
|
||||
printf("begin\n");
|
||||
#ifdef VMS
|
||||
lib$init_timer();
|
||||
#endif /*VMS*/
|
||||
|
||||
ptr = (struct dbr_gr_float *)
|
||||
malloc(dbr_size_n(DBR_GR_FLOAT, NUM));
|
||||
{
|
||||
TS_STAMP end_time;
|
||||
TS_STAMP start_time;
|
||||
dbr_double_t delay;
|
||||
dbr_double_t request = 0.5;
|
||||
dbr_double_t accuracy;
|
||||
|
||||
tsLocalTime(&start_time);
|
||||
status = ca_pend_event(request);
|
||||
if (status != ECA_TIMEOUT) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
tsLocalTime(&end_time);
|
||||
TsDiffAsDouble(&delay,&end_time,&start_time);
|
||||
accuracy = 100.0*(delay-request)/request;
|
||||
printf("CA pend event delay accuracy = %f %%\n",
|
||||
accuracy);
|
||||
assert (abs(accuracy) < 10.0);
|
||||
}
|
||||
|
||||
size = dbr_size_n(DBR_GR_FLOAT, NUM);
|
||||
ptr = (struct dbr_gr_float *) malloc(size);
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
|
||||
@@ -213,41 +263,81 @@ int doacctst(char *pname)
|
||||
ca_read_access(chix1),
|
||||
ca_write_access(chix1));
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* Verify that we can write and then read back
|
||||
* the same value
|
||||
* the same analog value
|
||||
*/
|
||||
if( (ca_field_type(chix1)==DBR_FLOAT ||
|
||||
ca_field_type(chix1)==DBR_DOUBLE) &&
|
||||
ca_read_access(chix1) &&
|
||||
ca_write_access(chix1)){
|
||||
|
||||
double dval = 3.3;
|
||||
float fval = -8893.3;
|
||||
double dret = DBL_MAX;
|
||||
float fret = FLT_MAX;
|
||||
dbr_double_t incr;
|
||||
dbr_double_t epsil;
|
||||
dbr_double_t base;
|
||||
unsigned long iter;
|
||||
|
||||
status = ca_put(DBR_DOUBLE, chix1, &dval);
|
||||
SEVCHK(status, NULL);
|
||||
status = ca_get(DBR_DOUBLE, chix1, &dret);
|
||||
SEVCHK(status, NULL);
|
||||
ca_pend_io(30.0);
|
||||
assert( fabs(dval-dret) < DBL_EPSILON*4);
|
||||
printf ("float test ...");
|
||||
fflush(stdout);
|
||||
epsil = FLT_EPSILON*4;
|
||||
base = FLT_MIN;
|
||||
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
|
||||
incr = ldexp (0.5,i);
|
||||
iter = FLT_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
floatTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
base = FLT_MAX;
|
||||
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
|
||||
incr = - ldexp (0.5,i);
|
||||
iter = FLT_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
floatTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
base = - FLT_MAX;
|
||||
for (i=FLT_MIN_EXP; i<FLT_MAX_EXP; i++) {
|
||||
incr = ldexp (0.5,i);
|
||||
iter = FLT_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
floatTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
printf ("done\n");
|
||||
|
||||
status = ca_put(DBR_FLOAT, chix1, &fval);
|
||||
SEVCHK(status, NULL);
|
||||
status = ca_get(DBR_FLOAT, chix1, &fret);
|
||||
SEVCHK(status, NULL);
|
||||
ca_pend_io(30.0);
|
||||
assert( fabs(fval-fret) < FLT_EPSILON*4);
|
||||
printf ("double test ...");
|
||||
fflush(stdout);
|
||||
epsil = DBL_EPSILON*4;
|
||||
base = DBL_MIN;
|
||||
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
|
||||
incr = ldexp (0.5,i);
|
||||
iter = DBL_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
doubleTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
base = DBL_MAX;
|
||||
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
|
||||
incr = - ldexp (0.5,i);
|
||||
iter = DBL_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
doubleTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
base = - DBL_MAX;
|
||||
for (i=DBL_MIN_EXP; i<DBL_MAX_EXP; i++) {
|
||||
incr = ldexp (0.5,i);
|
||||
iter = DBL_MAX/fabs(incr);
|
||||
iter = min (iter,10);
|
||||
doubleTest(chix1, base, incr, epsil, iter);
|
||||
}
|
||||
printf ("done\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* verify we dont jam up on many uninterrupted
|
||||
* solicitations
|
||||
*/
|
||||
if(ca_read_access(chix4)){
|
||||
float temp;
|
||||
dbr_float_t temp;
|
||||
|
||||
printf("Performing multiple get test...");
|
||||
fflush(stdout);
|
||||
@@ -268,7 +358,7 @@ int doacctst(char *pname)
|
||||
printf("Performing multiple put test...");
|
||||
fflush(stdout);
|
||||
for(i=0; i<10000; i++){
|
||||
double fval = 3.3;
|
||||
dbr_double_t fval = 3.3;
|
||||
status = ca_put(DBR_DOUBLE, chix4, &fval);
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
@@ -315,7 +405,7 @@ int doacctst(char *pname)
|
||||
printf("Performing multiple put callback test...");
|
||||
fflush(stdout);
|
||||
for(i=0; i<10000; i++){
|
||||
float fval = 3.3;
|
||||
dbr_float_t fval = 3.3F;
|
||||
status = ca_array_put_callback(
|
||||
DBR_FLOAT,
|
||||
1,
|
||||
@@ -339,8 +429,8 @@ int doacctst(char *pname)
|
||||
printf("Performing multiple monitor test...");
|
||||
fflush(stdout);
|
||||
{
|
||||
evid mid[1000];
|
||||
float temp;
|
||||
evid mid[1000];
|
||||
dbr_float_t temp;
|
||||
|
||||
for(i=0; i<NELEMENTS(mid); i++){
|
||||
SEVCHK(ca_add_event(DBR_GR_FLOAT, chix4, null_event,
|
||||
@@ -418,8 +508,8 @@ int doacctst(char *pname)
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
|
||||
pfloat = (float *) calloc(sizeof(float),NUM);
|
||||
pdouble = (double *) calloc(sizeof(double),NUM);
|
||||
pfloat = (dbr_float_t *) calloc(sizeof(*pfloat),NUM);
|
||||
pdouble = (dbr_double_t *) calloc(sizeof(*pdouble),NUM);
|
||||
pgrfloat = (struct dbr_gr_float *) calloc(sizeof(*pgrfloat),NUM);
|
||||
|
||||
if (VALID_DB_REQ(chix1->type))
|
||||
@@ -475,15 +565,44 @@ int doacctst(char *pname)
|
||||
SEVCHK(ca_modify_user_name("Willma"), NULL);
|
||||
SEVCHK(ca_modify_host_name("Bed Rock"), NULL);
|
||||
|
||||
if (conn_get_cb_count != 3){
|
||||
if (conn_cb_count != 3){
|
||||
printf ("!!!! Connect cb count = %d expected = 3 !!!!\n",
|
||||
conn_get_cb_count);
|
||||
conn_cb_count);
|
||||
}
|
||||
|
||||
printf("-- Put/Gets done- waiting for Events --\n");
|
||||
status = ca_pend_event(10.0);
|
||||
if (status != ECA_TIMEOUT) {
|
||||
SEVCHK(status, NULL);
|
||||
{
|
||||
TS_STAMP end_time;
|
||||
TS_STAMP start_time;
|
||||
dbr_double_t delay;
|
||||
dbr_double_t request = 15.0;
|
||||
dbr_double_t accuracy;
|
||||
|
||||
tsLocalTime(&start_time);
|
||||
printf("waiting for events for %f sec\n", request);
|
||||
status = ca_pend_event(request);
|
||||
if (status != ECA_TIMEOUT) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
tsLocalTime(&end_time);
|
||||
TsDiffAsDouble(&delay,&end_time,&start_time);
|
||||
accuracy = 100.0*(delay-request)/request;
|
||||
printf("CA pend event delay accuracy = %f %%\n",
|
||||
accuracy);
|
||||
assert (abs(accuracy) < 10.0);
|
||||
}
|
||||
|
||||
{
|
||||
TS_STAMP end_time;
|
||||
TS_STAMP start_time;
|
||||
dbr_double_t delay;
|
||||
|
||||
tsLocalTime(&start_time);
|
||||
printf("entering ca_task_exit()\n");
|
||||
status = ca_task_exit();
|
||||
SEVCHK(status,NULL);
|
||||
tsLocalTime(&end_time);
|
||||
TsDiffAsDouble(&delay,&end_time,&start_time);
|
||||
printf("in ca_task_exit() for %f sec\n", delay);
|
||||
}
|
||||
|
||||
if (ptr){
|
||||
@@ -499,17 +618,73 @@ int doacctst(char *pname)
|
||||
free(pgrfloat);
|
||||
}
|
||||
|
||||
status = ca_task_exit();
|
||||
SEVCHK(status,NULL);
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
void floatTest(
|
||||
chid chan,
|
||||
dbr_float_t beginValue,
|
||||
dbr_float_t increment,
|
||||
dbr_float_t epsilon,
|
||||
unsigned iterations)
|
||||
{
|
||||
unsigned i;
|
||||
dbr_float_t fval;
|
||||
dbr_float_t fretval;
|
||||
int status;
|
||||
|
||||
fval = beginValue;
|
||||
for (i=0; i<iterations; i++) {
|
||||
fretval = FLT_MAX;
|
||||
status = ca_put (DBR_FLOAT, chan, &fval);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_get (DBR_FLOAT, chan, &fretval);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_pend_io (100.0);
|
||||
SEVCHK (status, NULL);
|
||||
assert (fabs(fval-fretval) < epsilon);
|
||||
|
||||
fval += increment;
|
||||
}
|
||||
}
|
||||
|
||||
void doubleTest(
|
||||
chid chan,
|
||||
dbr_double_t beginValue,
|
||||
dbr_double_t increment,
|
||||
dbr_double_t epsilon,
|
||||
unsigned iterations)
|
||||
{
|
||||
unsigned i;
|
||||
dbr_double_t fval;
|
||||
dbr_double_t fretval;
|
||||
int status;
|
||||
|
||||
fval = beginValue;
|
||||
for (i=0; i<iterations; i++) {
|
||||
fretval = DBL_MAX;
|
||||
status = ca_put (DBR_DOUBLE, chan, &fval);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_get (DBR_DOUBLE, chan, &fretval);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_pend_io (100.0);
|
||||
SEVCHK (status, NULL);
|
||||
assert (fabs(fval-fretval) < epsilon);
|
||||
|
||||
fval += increment;
|
||||
}
|
||||
}
|
||||
|
||||
void null_event(struct event_handler_args args)
|
||||
{
|
||||
static int i;
|
||||
dbr_double_t fval = 3.8;
|
||||
int status;
|
||||
|
||||
#if 0
|
||||
status = ca_put (DBR_DOUBLE, args.chid, &fval);
|
||||
SEVCHK (status, NULL);
|
||||
#endif
|
||||
|
||||
if (i++ > 1000) {
|
||||
printf("1000 occurred\n");
|
||||
@@ -521,9 +696,15 @@ void null_event(struct event_handler_args args)
|
||||
void write_event(struct event_handler_args args)
|
||||
{
|
||||
int status;
|
||||
float a = *(float *) args.dbr;
|
||||
dbr_float_t *pFloat = (dbr_float_t *) args.dbr;
|
||||
dbr_float_t a;
|
||||
|
||||
a += 10.1;
|
||||
if (!args.dbr) {
|
||||
return;
|
||||
}
|
||||
|
||||
a = *pFloat;
|
||||
a += 10.1F;
|
||||
|
||||
status = ca_array_put(
|
||||
DBR_FLOAT,
|
||||
@@ -544,15 +725,15 @@ void conn(struct connection_handler_args args)
|
||||
else
|
||||
printf("Ukn conn ev\n");
|
||||
|
||||
ca_get_callback(DBR_GR_FLOAT, args.chid, conn_cb, NULL);
|
||||
ca_get_callback(DBR_GR_FLOAT, args.chid, get_cb, NULL);
|
||||
}
|
||||
|
||||
void conn_cb(struct event_handler_args args)
|
||||
void get_cb(struct event_handler_args args)
|
||||
{
|
||||
if(!(args.status & CA_M_SUCCESS)){
|
||||
printf("Get cb failed because \"%s\"\n", ca_message(args.status));
|
||||
}
|
||||
conn_get_cb_count++;
|
||||
conn_cb_count++;
|
||||
}
|
||||
|
||||
|
||||
@@ -612,10 +793,10 @@ void test_sync_groups(chid chix)
|
||||
*/
|
||||
void multiple_sg_requests(chid chix, CA_SYNC_GID gid)
|
||||
{
|
||||
int status;
|
||||
unsigned i;
|
||||
static float fvalput = 3.3;
|
||||
static float fvalget;
|
||||
int status;
|
||||
unsigned i;
|
||||
static dbr_float_t fvalput = 3.3F;
|
||||
static dbr_float_t fvalget;
|
||||
|
||||
for(i=0; i<1000; i++){
|
||||
if(ca_write_access(chix)){
|
||||
|
||||
@@ -19,7 +19,7 @@ void caAddConfiguredAddr(
|
||||
int port);
|
||||
|
||||
int local_addr(SOCKET socket, struct sockaddr_in *plcladdr);
|
||||
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort);
|
||||
unsigned short caFetchPortConfig(ENV_PARAM *pEnv, unsigned short defaultPort);
|
||||
|
||||
union caAddr{
|
||||
struct sockaddr_in inetAddr;
|
||||
|
||||
@@ -115,7 +115,13 @@ int cac_select_io(struct timeval *ptimeout, int flags)
|
||||
&autoTimeOut);
|
||||
# endif
|
||||
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
/*
|
||||
* get a new time stamp if we have been waiting
|
||||
* for any significant length of time
|
||||
*/
|
||||
if (ptimeout->tv_sec || ptimeout->tv_usec) {
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
}
|
||||
|
||||
if (status<0) {
|
||||
if (MYERRNO == EINTR) {
|
||||
|
||||
@@ -59,6 +59,7 @@ LOCAL void test (
|
||||
unsigned iterations
|
||||
);
|
||||
|
||||
LOCAL tf test_pend;
|
||||
LOCAL tf test_search;
|
||||
LOCAL tf test_free;
|
||||
LOCAL tf test_wait;
|
||||
@@ -82,7 +83,7 @@ int main(int argc, char **argv)
|
||||
catime(pname);
|
||||
}
|
||||
else{
|
||||
printf("usage: %s <channel name>", argv[0]);
|
||||
printf("usage: %s <channel name>\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
@@ -119,6 +120,9 @@ int catime (char *channelName)
|
||||
ca_field_type(itemList[0].chix),
|
||||
ca_element_count(itemList[0].chix));
|
||||
|
||||
printf ("\tpend event test\n");
|
||||
timeIt (test_pend, NULL, 100);
|
||||
|
||||
for (i=0; i<NELEMENTS(itemList); i++) {
|
||||
itemList[i].val.fltval = 0.0;
|
||||
itemList[i].type = DBR_FLOAT;
|
||||
@@ -183,14 +187,56 @@ void timeIt(
|
||||
unsigned inlineIter;
|
||||
|
||||
status = tsLocalTime(&start_time);
|
||||
#if 0
|
||||
assert (status == S_ts_OK);
|
||||
#endif
|
||||
(*pfunc) (pItems, iterations, &inlineIter);
|
||||
status = tsLocalTime(&end_time);
|
||||
#if 0
|
||||
assert (status == S_ts_OK);
|
||||
#endif
|
||||
TsDiffAsDouble(&delay,&end_time,&start_time);
|
||||
printf ("Elapsed Per Item = %f\n", delay/(iterations*inlineIter));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* test_search ()
|
||||
*/
|
||||
LOCAL void test_pend(
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
unsigned i;
|
||||
int status;
|
||||
|
||||
for (i=0; i<iterations; i++) {
|
||||
status = ca_pend_event(1e-9);
|
||||
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
status = ca_pend_event(1e-9);
|
||||
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
status = ca_pend_event(1e-9);
|
||||
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
status = ca_pend_event(1e-9);
|
||||
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
status = ca_pend_event(1e-9);
|
||||
if (status != ECA_TIMEOUT && status != ECA_NORMAL) {
|
||||
SEVCHK(status, NULL);
|
||||
}
|
||||
}
|
||||
*pInlineIter = 5;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* test_search ()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* $Id$ */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
/* Los Alamos National Laboratory */
|
||||
/* Los Alamos, New Mexico 87545 */
|
||||
@@ -28,6 +29,7 @@
|
||||
/* .12 110194 joh improved search scheduling */
|
||||
/* (dont send all chans in a block) */
|
||||
/* */
|
||||
/* $Log$ */
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -349,7 +351,7 @@ LOCAL void logRetryInterval(char *pFN, unsigned lineno)
|
||||
/*
|
||||
* MARK_SERVER_AVAILABLE
|
||||
*/
|
||||
void mark_server_available(struct in_addr *pnet_addr)
|
||||
void mark_server_available(const struct in_addr *pnet_addr)
|
||||
{
|
||||
chid chan;
|
||||
ca_real currentPeriod;
|
||||
@@ -502,7 +504,7 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
*
|
||||
* LOCK must be applied
|
||||
*/
|
||||
bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
|
||||
bhe *createBeaconHashEntry(const struct in_addr *pnet_addr)
|
||||
{
|
||||
bhe *pBHE;
|
||||
unsigned index;
|
||||
@@ -535,7 +537,7 @@ bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
|
||||
* start the average at zero
|
||||
*/
|
||||
pBHE->averagePeriod = 0.0;
|
||||
cac_gettimeval(&pBHE->timeStamp);
|
||||
pBHE->timeStamp = ca_static->currentTime;
|
||||
|
||||
/*
|
||||
* install in the hash table
|
||||
@@ -552,7 +554,7 @@ bhe *createBeaconHashEntry(struct in_addr *pnet_addr)
|
||||
*
|
||||
* LOCK must be applied
|
||||
*/
|
||||
bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr)
|
||||
bhe *lookupBeaconInetAddr (const struct in_addr *pnet_addr)
|
||||
{
|
||||
bhe *pBHE;
|
||||
unsigned index;
|
||||
@@ -579,7 +581,7 @@ bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr)
|
||||
*
|
||||
* LOCK must be applied
|
||||
*/
|
||||
void removeBeaconInetAddr (struct in_addr *pnet_addr)
|
||||
void removeBeaconInetAddr (const struct in_addr *pnet_addr)
|
||||
{
|
||||
bhe *pBHE;
|
||||
bhe **ppBHE;
|
||||
|
||||
343
src/ca/iocinf.c
343
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,7 @@
|
||||
/* 021794 joh turn on SO_REUSEADDR only after the test for */
|
||||
/* address in use so that test works on UNIX */
|
||||
/* kernels that support multicast */
|
||||
/* $Log$ */
|
||||
/* */
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
@@ -94,8 +96,9 @@ LOCAL char *getToken(char **ppString);
|
||||
*
|
||||
*/
|
||||
int alloc_ioc(
|
||||
struct in_addr *pnet_addr,
|
||||
struct ioc_in_use **ppiiu
|
||||
const struct in_addr *pnet_addr,
|
||||
unsigned short port,
|
||||
struct ioc_in_use **ppiiu
|
||||
)
|
||||
{
|
||||
int status;
|
||||
@@ -127,6 +130,7 @@ struct ioc_in_use **ppiiu
|
||||
status = create_net_chan(
|
||||
ppiiu,
|
||||
pnet_addr,
|
||||
port,
|
||||
IPPROTO_TCP);
|
||||
if(status == ECA_NORMAL){
|
||||
pBHE->piiu = *ppiiu;
|
||||
@@ -145,7 +149,8 @@ struct ioc_in_use **ppiiu
|
||||
*/
|
||||
int create_net_chan(
|
||||
struct ioc_in_use **ppiiu,
|
||||
struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
const struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
unsigned short port,
|
||||
int net_proto
|
||||
)
|
||||
{
|
||||
@@ -190,8 +195,7 @@ int net_proto
|
||||
memset((char *)&pNode->destAddr,0,sizeof(pNode->destAddr));
|
||||
pNode->destAddr.inetAddr.sin_family = AF_INET;
|
||||
pNode->destAddr.inetAddr.sin_addr = *pnet_addr;
|
||||
pNode->destAddr.inetAddr.sin_port =
|
||||
htons (ca_static->ca_server_port);
|
||||
pNode->destAddr.inetAddr.sin_port = htons (port);
|
||||
ellAdd(&piiu->destAddr, &pNode->node);
|
||||
piiu->recvBytes = tcp_recv_msg;
|
||||
piiu->sendBytes = cac_tcp_send_msg_piiu;
|
||||
@@ -398,7 +402,7 @@ int net_proto
|
||||
* let slib pick lcl addr
|
||||
*/
|
||||
saddr.sin_addr.s_addr = INADDR_ANY;
|
||||
saddr.sin_port = htons(0);
|
||||
saddr.sin_port = htons(0U);
|
||||
|
||||
status = bind( sock,
|
||||
(struct sockaddr *) &saddr,
|
||||
@@ -584,8 +588,14 @@ void notify_ca_repeater()
|
||||
* SOLARIS will not accept a zero length message
|
||||
* and we are just porting there for 3.12 so
|
||||
* we will use the new protocol for 3.12
|
||||
*
|
||||
* recent versions of UCX will not accept a zero
|
||||
* length message and we will assume that folks
|
||||
* using newer versions of UCX have rebooted (and
|
||||
* therefore restarted the CA repeater - and therefore
|
||||
* moved it to an EPICS release that accepets this protocol)
|
||||
*/
|
||||
# ifdef SOLARIS
|
||||
# if defined(SOLARIS) || defined(UCX)
|
||||
len = sizeof(msg);
|
||||
# else /* SOLARIS */
|
||||
len = 0;
|
||||
@@ -593,7 +603,7 @@ void notify_ca_repeater()
|
||||
|
||||
status = sendto(
|
||||
piiuCast->sock_chan,
|
||||
(char *)&msg, /* UCX requires a valid address here */
|
||||
(char *)&msg,
|
||||
len,
|
||||
0,
|
||||
(struct sockaddr *)&saddr,
|
||||
@@ -601,11 +611,16 @@ void notify_ca_repeater()
|
||||
if(status < 0){
|
||||
if( MYERRNO != EINTR &&
|
||||
MYERRNO != ENOBUFS &&
|
||||
MYERRNO != EWOULDBLOCK){
|
||||
MYERRNO != EWOULDBLOCK &&
|
||||
/*
|
||||
* This is returned from Linux when
|
||||
* the repeater isnt running
|
||||
*/
|
||||
MYERRNO != ECONNREFUSED
|
||||
){
|
||||
ca_printf(
|
||||
"send error => %s\n",
|
||||
strerror(MYERRNO));
|
||||
assert(0);
|
||||
"CAC: error sending to repeater is \"%s\"\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
}
|
||||
else{
|
||||
@@ -655,33 +670,28 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
status = sendto(
|
||||
piiu->sock_chan,
|
||||
&piiu->send.buf[piiu->send.rdix],
|
||||
sendCnt,
|
||||
(int) sendCnt,
|
||||
0,
|
||||
&pNode->destAddr.sockAddr,
|
||||
sizeof(pNode->destAddr.sockAddr));
|
||||
if(status<0){
|
||||
if(status>=0){
|
||||
actualSendCnt = (unsigned long) status;
|
||||
assert (actualSendCnt == sendCnt);
|
||||
pNode = (caAddrNode *) pNode->node.next;
|
||||
}
|
||||
else {
|
||||
int localErrno;
|
||||
|
||||
localErrno = MYERRNO;
|
||||
|
||||
if( localErrno == EWOULDBLOCK &&
|
||||
localErrno == ENOBUFS &&
|
||||
localErrno == EINTR){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
if( localErrno != EWOULDBLOCK &&
|
||||
localErrno != ENOBUFS &&
|
||||
localErrno != EINTR){
|
||||
ca_printf(
|
||||
"CAC: error on socket send() %s\n",
|
||||
"CAC: UDP send error = \"%s\"\n",
|
||||
strerror(localErrno));
|
||||
}
|
||||
|
||||
TAG_CONN_DOWN(piiu);
|
||||
break;
|
||||
}
|
||||
actualSendCnt = (unsigned long) status;
|
||||
assert (actualSendCnt == sendCnt);
|
||||
pNode = (caAddrNode *) pNode->node.next;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -739,26 +749,24 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
return;
|
||||
}
|
||||
|
||||
assert (sendCnt<=INT_MAX);
|
||||
|
||||
status = send(
|
||||
piiu->sock_chan,
|
||||
&piiu->send.buf[piiu->send.rdix],
|
||||
sendCnt,
|
||||
(int) sendCnt,
|
||||
0);
|
||||
if (status<0) {
|
||||
if (status<=0) {
|
||||
break;
|
||||
}
|
||||
else if (status==0) {
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status);
|
||||
}
|
||||
|
||||
if (status != sendCnt) {
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
if (status==0) {
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
localError = MYERRNO;
|
||||
@@ -901,9 +909,11 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
|
||||
break;
|
||||
}
|
||||
|
||||
assert (writeSpace<=INT_MAX);
|
||||
|
||||
status = recv( piiu->sock_chan,
|
||||
&piiu->recv.buf[piiu->recv.wtix],
|
||||
writeSpace,
|
||||
(int) writeSpace,
|
||||
0);
|
||||
if(status == 0){
|
||||
TAG_CONN_DOWN(piiu);
|
||||
@@ -926,7 +936,7 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
|
||||
break;
|
||||
}
|
||||
|
||||
assert (status<=writeSpace);
|
||||
assert (((unsigned long)status)<=writeSpace);
|
||||
|
||||
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
|
||||
|
||||
@@ -935,13 +945,8 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
|
||||
* from this IOC
|
||||
*/
|
||||
piiu->timeAtLastRecv = ca_static->currentTime;
|
||||
|
||||
if (status != writeSpace) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
@@ -1042,8 +1047,17 @@ LOCAL void udp_recv_msg(struct ioc_in_use *piiu)
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
# ifdef linux
|
||||
/*
|
||||
* Avoid spurious ECONNREFUSED bug
|
||||
* in linux
|
||||
*/
|
||||
if (MYERRNO==ECONNREFUSED) {
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
# endif
|
||||
ca_printf("Unexpected UDP failure %s\n", strerror(MYERRNO));
|
||||
TAG_CONN_DOWN(piiu);
|
||||
}
|
||||
else if(status > 0){
|
||||
unsigned long bytesActual;
|
||||
@@ -1195,6 +1209,8 @@ void close_ioc (struct ioc_in_use *piiu)
|
||||
piiuCast = NULL;
|
||||
}
|
||||
else {
|
||||
chid pNext;
|
||||
|
||||
/*
|
||||
* remove IOC from the hash table
|
||||
*/
|
||||
@@ -1208,73 +1224,20 @@ void close_ioc (struct ioc_in_use *piiu)
|
||||
* handler tries to use a channel before
|
||||
* I mark it disconnected.
|
||||
*/
|
||||
chix = (chid) &piiu->chidlist.node.next;
|
||||
while (chix = (chid) chix->node.next) {
|
||||
chix->type = TYPENOTCONN;
|
||||
chix->count = 0U;
|
||||
chix = (chid) ellFirst(&piiu->chidlist);
|
||||
while (chix) {
|
||||
chix->state = cs_prev_conn;
|
||||
chix->id.sid = ~0U;
|
||||
chix->ar.read_access = FALSE;
|
||||
chix->ar.write_access = FALSE;
|
||||
/*
|
||||
* try to reconnect
|
||||
*/
|
||||
chix->retry = 0U;
|
||||
chix = (chid) ellNext(&chix->node);
|
||||
}
|
||||
|
||||
if (piiu->chidlist.count) {
|
||||
ca_signal (ECA_DISCONN,piiu->host_name_str);
|
||||
chix = (chid) ellFirst(&piiu->chidlist);
|
||||
while (chix) {
|
||||
pNext = (chid) ellNext(&chix->node);
|
||||
cacDisconnectChannel(chix, TRUE);
|
||||
chix = pNext;
|
||||
}
|
||||
|
||||
/*
|
||||
* clear outstanding get call backs
|
||||
*/
|
||||
caIOBlockListFree (&pend_read_list, chix, TRUE, ECA_DISCONN);
|
||||
|
||||
/*
|
||||
* clear outstanding put call backs
|
||||
*/
|
||||
caIOBlockListFree (&pend_write_list, chix, TRUE, ECA_DISCONN);
|
||||
|
||||
/*
|
||||
* call their connection handler as required
|
||||
*/
|
||||
chix = (chid) &piiu->chidlist.node.next;
|
||||
while (chix = (chid) chix->node.next) {
|
||||
LOCKEVENTS;
|
||||
if (chix->pConnFunc) {
|
||||
struct connection_handler_args args;
|
||||
|
||||
args.chid = chix;
|
||||
args.op = CA_OP_CONN_DOWN;
|
||||
(*chix->pConnFunc) (args);
|
||||
}
|
||||
if (chix->pAccessRightsFunc) {
|
||||
struct access_rights_handler_args args;
|
||||
|
||||
args.chid = chix;
|
||||
args.ar = chix->ar;
|
||||
(*chix->pAccessRightsFunc) (args);
|
||||
}
|
||||
UNLOCKEVENTS;
|
||||
chix->piiu = piiuCast;
|
||||
}
|
||||
|
||||
/*
|
||||
* move all channels to the broadcast IIU
|
||||
*
|
||||
* if we loose the broadcast IIU its a severe error
|
||||
*/
|
||||
assert (piiuCast);
|
||||
ellConcat (&piiuCast->chidlist, &piiu->chidlist);
|
||||
assert (piiu->chidlist.count==0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to reconnect
|
||||
*/
|
||||
ca_static->ca_search_retry = 0;
|
||||
|
||||
if (fd_register_func) {
|
||||
LOCKEVENTS;
|
||||
(*fd_register_func) (fd_register_arg, piiu->sock_chan, FALSE);
|
||||
@@ -1297,11 +1260,78 @@ void close_ioc (struct ioc_in_use *piiu)
|
||||
|
||||
ellFree (&piiu->destAddr);
|
||||
|
||||
ca_signal (ECA_DISCONN,piiu->host_name_str);
|
||||
|
||||
free (piiu);
|
||||
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cacDisconnectChannel()
|
||||
*/
|
||||
void cacDisconnectChannel(chid chix, int fullDisconnect)
|
||||
{
|
||||
struct ioc_in_use *piiu;
|
||||
|
||||
chix->type = TYPENOTCONN;
|
||||
chix->count = 0U;
|
||||
chix->id.sid = ~0U;
|
||||
chix->ar.read_access = FALSE;
|
||||
chix->ar.write_access = FALSE;
|
||||
|
||||
/*
|
||||
* try to reconnect
|
||||
*/
|
||||
chix->retry = 0U;
|
||||
|
||||
/*
|
||||
* call their connection handler as required
|
||||
*/
|
||||
if (fullDisconnect) {
|
||||
chix->state = cs_prev_conn;
|
||||
|
||||
/*
|
||||
* clear outstanding get call backs
|
||||
*/
|
||||
caIOBlockListFree (&pend_read_list, chix,
|
||||
TRUE, ECA_DISCONN);
|
||||
|
||||
/*
|
||||
* clear outstanding put call backs
|
||||
*/
|
||||
caIOBlockListFree (&pend_write_list, chix,
|
||||
TRUE, ECA_DISCONN);
|
||||
|
||||
LOCKEVENTS;
|
||||
if (chix->pConnFunc) {
|
||||
struct connection_handler_args args;
|
||||
|
||||
args.chid = chix;
|
||||
args.op = CA_OP_CONN_DOWN;
|
||||
(*chix->pConnFunc) (args);
|
||||
}
|
||||
if (chix->pAccessRightsFunc) {
|
||||
struct access_rights_handler_args args;
|
||||
|
||||
args.chid = chix;
|
||||
args.ar = chix->ar;
|
||||
(*chix->pAccessRightsFunc) (args);
|
||||
}
|
||||
UNLOCKEVENTS;
|
||||
}
|
||||
piiu = (struct ioc_in_use *)chix->piiu;
|
||||
ellDelete(&piiu->chidlist, &chix->node);
|
||||
assert (piiuCast);
|
||||
chix->piiu = piiuCast;
|
||||
ellAdd(&piiuCast->chidlist, &chix->node);
|
||||
|
||||
/*
|
||||
* Try to reconnect this channel
|
||||
*/
|
||||
ca_static->ca_search_retry = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@@ -1704,7 +1734,7 @@ void caPrintAddrList(ELLLIST *pList)
|
||||
/*
|
||||
* caFetchPortConfig()
|
||||
*/
|
||||
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
|
||||
unsigned short caFetchPortConfig(ENV_PARAM *pEnv, unsigned short defaultPort)
|
||||
{
|
||||
long longStatus;
|
||||
long epicsParam;
|
||||
@@ -1712,30 +1742,113 @@ int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
|
||||
|
||||
longStatus = envGetLongConfigParam(pEnv, &epicsParam);
|
||||
if (longStatus!=0) {
|
||||
epicsParam = defaultPort;
|
||||
epicsParam = (long) defaultPort;
|
||||
ca_printf ("EPICS \"%s\" integer fetch failed\n", pEnv->name);
|
||||
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, epicsParam);
|
||||
}
|
||||
|
||||
/*
|
||||
* This must be a server port that will fit in a signed
|
||||
* This must be a server port that will fit in an unsigned
|
||||
* short
|
||||
*/
|
||||
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>SHRT_MAX) {
|
||||
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>USHRT_MAX) {
|
||||
ca_printf ("EPICS \"%s\" out of range\n", pEnv->name);
|
||||
/*
|
||||
* Quit if the port is wrong due CA coding error
|
||||
*/
|
||||
assert (epicsParam != defaultPort);
|
||||
epicsParam = defaultPort;
|
||||
assert (epicsParam != (long) defaultPort);
|
||||
epicsParam = (long) defaultPort;
|
||||
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, epicsParam);
|
||||
}
|
||||
|
||||
/*
|
||||
* ok to clip to int here because we checked the range
|
||||
*/
|
||||
port = (int) epicsParam;
|
||||
port = (unsigned short) epicsParam;
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CAC_MUX_IO()
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout = *ptimeout;
|
||||
while (TRUE) {
|
||||
count = cac_select_io(&timeout, CA_DO_RECVS|CA_DO_SENDS);
|
||||
if (count<=0) {
|
||||
/*
|
||||
* if its a flush then loop until all
|
||||
* of the send buffers are empty
|
||||
*/
|
||||
if (ca_static->ca_flush_pending) {
|
||||
/*
|
||||
* complete flush is postponed if we are
|
||||
* inside an event routine
|
||||
*/
|
||||
if (EVENTLOCKTEST) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (caSendMsgPending()) {
|
||||
LD_CA_TIME (SELECT_POLL, &timeout);
|
||||
}
|
||||
else {
|
||||
ca_static->ca_flush_pending
|
||||
= FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LD_CA_TIME (0.0, &timeout);
|
||||
}
|
||||
ca_process_input_queue();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* caSendMsgPending()
|
||||
*/
|
||||
int caSendMsgPending()
|
||||
{
|
||||
int pending = FALSE;
|
||||
unsigned long bytesPending;
|
||||
struct ioc_in_use *piiu;
|
||||
|
||||
LOCK;
|
||||
for( piiu = (IIU *) ellFirst(&iiuList);
|
||||
piiu;
|
||||
piiu = (IIU *) ellNext(&piiu->node)){
|
||||
|
||||
if(piiu == piiuCast || piiu->conn_up == FALSE){
|
||||
continue;
|
||||
}
|
||||
|
||||
bytesPending = cacRingBufferReadSize(&piiu->send, FALSE);
|
||||
if(bytesPending > 0U){
|
||||
pending = TRUE;
|
||||
}
|
||||
}
|
||||
UNLOCK;
|
||||
|
||||
return pending;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* $Id */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* L O S A L A M O S */
|
||||
@@ -28,7 +29,20 @@
|
||||
/* .17 121892 joh added TCP send buf size var */
|
||||
/* .18 122192 joh added outstanding ack var */
|
||||
/* .19 012094 joh added minor version (for each server) */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/* $Log$
|
||||
* Revision 1.49 1995/10/12 01:33:12 jhill
|
||||
* Initial delay between search frames went from .1 to .01 sec,
|
||||
* Added flush pending flag, Make all usage of port be unsigned short.
|
||||
*
|
||||
* Revision 1.48 1995/09/29 21:55:38 jhill
|
||||
* added func proto for cacDisconnectChannel()
|
||||
*
|
||||
* Revision 1.47 1995/08/22 00:20:27 jhill
|
||||
* added KLUDGE def of S_db_Pending
|
||||
*/
|
||||
|
||||
/*_begin */
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -86,6 +100,7 @@ HDRVERSIONID(iocinfh, "$Id$")
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <shareLib.h>
|
||||
|
||||
/*
|
||||
* OS dependent includes
|
||||
@@ -158,8 +173,8 @@ struct putCvrtBuf{
|
||||
/*
|
||||
* for use with cac_select_io()
|
||||
*/
|
||||
#define CA_DO_SENDS 1
|
||||
#define CA_DO_RECVS 2
|
||||
#define CA_DO_SENDS (1<<0)
|
||||
#define CA_DO_RECVS (1<<1)
|
||||
|
||||
struct pending_io_event{
|
||||
ELLNODE node;
|
||||
@@ -190,8 +205,12 @@ extern const ca_time CA_CURRENT_TIME;
|
||||
*/
|
||||
#define MAXCONNTRIES 30 /* N conn retries on unchanged net */
|
||||
|
||||
#define SELECT_POLL (0.05) /* units sec - polls into recast */
|
||||
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
|
||||
/*
|
||||
* NOTE: These must be larger than one vxWorks tick or we will end up
|
||||
* using the CPU. A vxWorks tick is usually 1/60th of a sec.
|
||||
*/
|
||||
#define SELECT_POLL (0.025) /* units sec - polls into recast */
|
||||
#define CA_RECAST_DELAY (0.025) /* initial delay to next recast (sec) */
|
||||
#define CA_RECAST_PORT_MASK 0xff /* random retry interval off port */
|
||||
#define CA_RECAST_PERIOD (5.0) /* ul on retry period long term (sec) */
|
||||
|
||||
@@ -409,9 +428,11 @@ struct ca_static{
|
||||
void (*ca_exception_func)
|
||||
(struct exception_handler_args);
|
||||
void *ca_exception_arg;
|
||||
#if 0
|
||||
void (*ca_connection_func)
|
||||
(struct connection_handler_args);
|
||||
void *ca_connection_arg;
|
||||
#endif
|
||||
int (*ca_printf_func)(const char *pformat, va_list args);
|
||||
void (*ca_fd_register_func)
|
||||
(void *, SOCKET, int);
|
||||
@@ -430,6 +451,7 @@ struct ca_static{
|
||||
unsigned ca_post_msg_active:1;
|
||||
unsigned ca_manage_conn_active:1;
|
||||
unsigned ca_repeater_contacted:1;
|
||||
unsigned ca_flush_pending:1;
|
||||
#if defined(vxWorks)
|
||||
SEM_ID ca_io_done_sem;
|
||||
SEM_ID ca_blockSem;
|
||||
@@ -511,7 +533,7 @@ void issue_client_host_name(struct ioc_in_use *piiu);
|
||||
int ca_defunct(void);
|
||||
int ca_printf(char *pformat, ...);
|
||||
void manage_conn(int silent);
|
||||
void mark_server_available(struct in_addr *pnet_addr);
|
||||
void mark_server_available(const struct in_addr *pnet_addr);
|
||||
void flow_control(struct ioc_in_use *piiu);
|
||||
int broadcast_addr(struct in_addr *pcastaddr);
|
||||
void ca_repeater(void);
|
||||
@@ -521,18 +543,19 @@ void ca_sg_init(void);
|
||||
void ca_sg_shutdown(struct ca_static *ca_temp);
|
||||
int cac_select_io(struct timeval *ptimeout, int flags);
|
||||
void caHostFromInetAddr(
|
||||
struct in_addr *pnet_addr,
|
||||
char *pBuf,
|
||||
unsigned size
|
||||
const struct in_addr *pnet_addr,
|
||||
char *pBuf,
|
||||
unsigned size
|
||||
);
|
||||
int post_msg(
|
||||
struct ioc_in_use *piiu,
|
||||
struct in_addr *pnet_addr,
|
||||
const struct in_addr *pnet_addr,
|
||||
char *pInBuf,
|
||||
unsigned long blockSize
|
||||
);
|
||||
int alloc_ioc(
|
||||
struct in_addr *pnet_addr,
|
||||
const struct in_addr *pnet_addr,
|
||||
unsigned short port,
|
||||
struct ioc_in_use **ppiiu
|
||||
);
|
||||
unsigned long cacRingBufferWrite(
|
||||
@@ -565,7 +588,8 @@ char *localHostName(void);
|
||||
|
||||
int create_net_chan(
|
||||
struct ioc_in_use **ppiiu,
|
||||
struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
const struct in_addr *pnet_addr, /* only used by TCP connections */
|
||||
unsigned short port,
|
||||
int net_proto
|
||||
);
|
||||
|
||||
@@ -576,9 +600,9 @@ void caSetupBCastAddrList (ELLLIST *pList, SOCKET sock, unsigned port);
|
||||
int ca_os_independent_init (void);
|
||||
|
||||
void freeBeaconHash(struct ca_static *ca_temp);
|
||||
void removeBeaconInetAddr(struct in_addr *pnet_addr);
|
||||
bhe *lookupBeaconInetAddr(struct in_addr *pnet_addr);
|
||||
bhe *createBeaconHashEntry(struct in_addr *pnet_addr);
|
||||
void removeBeaconInetAddr(const struct in_addr *pnet_addr);
|
||||
bhe *lookupBeaconInetAddr(const struct in_addr *pnet_addr);
|
||||
bhe *createBeaconHashEntry(const struct in_addr *pnet_addr);
|
||||
void close_ioc(IIU *piiu);
|
||||
void notify_ca_repeater(void);
|
||||
void cac_clean_iiu_list(void);
|
||||
@@ -602,7 +626,9 @@ ca_real cac_time_diff(ca_time *pTVA, ca_time *pTVB);
|
||||
ca_time cac_time_sum(ca_time *pTVA, ca_time *pTVB);
|
||||
void caIOBlockFree(evid pIOBlock);
|
||||
void clearChannelResources(unsigned id);
|
||||
void caSetDefaultPrintfHandler ();
|
||||
void caSetDefaultPrintfHandler (void);
|
||||
void cacDisconnectChannel(chid chix, int fullDisconnect);
|
||||
int caSendMsgPending(void);
|
||||
|
||||
/*
|
||||
* !!KLUDGE!!
|
||||
@@ -613,5 +639,6 @@ void caSetDefaultPrintfHandler ();
|
||||
*/
|
||||
#define M_dbAccess (501 <<16) /*Database Access Routines */
|
||||
#define S_db_Blocked (M_dbAccess|39) /*Request is Blocked*/
|
||||
#define S_db_Pending (M_dbAccess|37) /*Request is pending*/
|
||||
|
||||
#endif /* this must be the last line in this file */
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#ifndef __IOCMSG__
|
||||
/* $Id$ */
|
||||
/*
|
||||
* History
|
||||
* .01 01xx90 joh removed status field in favor of a independent m_cmmd-
|
||||
@@ -23,6 +24,10 @@
|
||||
* .09 050594 joh New command added for CA V4.3 - repeater fanout register
|
||||
*
|
||||
* .10 050594 joh New command added for CA V4.3 - wakeup the server
|
||||
* $Log$
|
||||
* Revision 1.23 1995/08/23 00:35:17 jhill
|
||||
* added log entries
|
||||
*
|
||||
*/
|
||||
|
||||
#define __IOCMSG__
|
||||
@@ -31,23 +36,29 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
|
||||
|
||||
/* TCP/UDP port number (bumped each protocol change) */
|
||||
#define CA_PROTOCOL_VERSION 4
|
||||
#define CA_MINOR_VERSION 4
|
||||
#define CA_MINOR_VERSION 6
|
||||
#define CA_UKN_MINOR_VERSION 0 /* unknown minor version */
|
||||
#if CA_PROTOCOL_VERSION == 4
|
||||
#define CA_V41(MAJOR,MINOR) ((MINOR)>=1)
|
||||
#define CA_V42(MAJOR,MINOR) ((MINOR)>=2)
|
||||
#define CA_V43(MAJOR,MINOR) ((MINOR)>=3)
|
||||
#define CA_V44(MAJOR,MINOR) ((MINOR)>=4)
|
||||
#define CA_V45(MAJOR,MINOR) ((MINOR)>=5)
|
||||
#define CA_V46(MAJOR,MINOR) ((MINOR)>=6)
|
||||
#elif CA_PROTOCOL_VERSION > 4
|
||||
#define CA_V41(MAJOR,MINOR) ( 1 )
|
||||
#define CA_V42(MAJOR,MINOR) ( 1 )
|
||||
#define CA_V43(MAJOR,MINOR) ( 1 )
|
||||
#define CA_V44(MAJOR,MINOR) ( 1 )
|
||||
#define CA_V45(MAJOR,MINOR) ( 1 )
|
||||
#define CA_V46(MAJOR,MINOR) ( 1 )
|
||||
#else
|
||||
#define CA_V41(MAJOR,MINOR) ( 0 )
|
||||
#define CA_V42(MAJOR,MINOR) ( 0 )
|
||||
#define CA_V43(MAJOR,MINOR) ( 0 )
|
||||
#define CA_V44(MAJOR,MINOR) ( 0 )
|
||||
#define CA_V45(MAJOR,MINOR) ( 0 )
|
||||
#define CA_V46(MAJOR,MINOR) ( 0 )
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -56,7 +67,7 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
|
||||
* environment variables "EPICS_CA_REPEATER_PORT" and
|
||||
* "EPICS_CA_SERVER_PORT"
|
||||
*/
|
||||
#define CA_PORT_BASE IPPORT_USERRESERVED + 56
|
||||
#define CA_PORT_BASE IPPORT_USERRESERVED + 56U
|
||||
#define CA_SERVER_PORT (CA_PORT_BASE+CA_PROTOCOL_VERSION*2)
|
||||
#define CA_REPEATER_PORT (CA_PORT_BASE+CA_PROTOCOL_VERSION*2+1)
|
||||
|
||||
@@ -72,7 +83,7 @@ HDRVERSIONID(iocmsgh, "@(#) $Id$ CA version 4.4")
|
||||
typedef unsigned short ca_uint16_t;
|
||||
typedef unsigned int ca_uint32_t;
|
||||
typedef float ca_float32_t;
|
||||
|
||||
typedef ca_uint32_t caResId;
|
||||
|
||||
/* values for m_cmmd */
|
||||
#define IOC_NOOP 0 /* do nothing, but verify TCP */
|
||||
@@ -101,6 +112,7 @@ typedef float ca_float32_t;
|
||||
#define IOC_ECHO 23 /* CA V4.3 connection verify */
|
||||
#define REPEATER_REGISTER 24 /* registr for repeater fan out */
|
||||
#define IOC_SIGNAL 25 /* knock the server out of select */
|
||||
#define IOC_CLAIM_CIU_FAILED 26 /* unable to create chan resource in server */
|
||||
|
||||
/*
|
||||
* for use with search and not_found (if search fails and
|
||||
@@ -110,15 +122,15 @@ typedef float ca_float32_t;
|
||||
#define DONTREPLY 5
|
||||
|
||||
/* size of object in bytes rounded up to nearest oct word */
|
||||
#define OCT_ROUND(A) ((((unsigned long)A)+7)>>3)
|
||||
#define OCT_ROUND(A) ((((unsigned long)(A))+7)>>3)
|
||||
#define OCT_SIZEOF(A) (OCT_ROUND(sizeof(A)))
|
||||
|
||||
/* size of object in bytes rounded up to nearest long word */
|
||||
#define QUAD_ROUND(A) (((unsigned long)A)+3)>>2)
|
||||
#define QUAD_ROUND(A) (((unsigned long)(A))+3)>>2)
|
||||
#define QUAD_SIZEOF(A) (QUAD_ROUND(sizeof(A)))
|
||||
|
||||
/* size of object in bytes rounded up to nearest short word */
|
||||
#define BI_ROUND(A) ((((unsigned long)A)+1)>>1)
|
||||
#define BI_ROUND(A) ((((unsigned long)(A))+1)>>1)
|
||||
#define BI_SIZEOF(A) (BI_ROUND(sizeof(A)))
|
||||
|
||||
/*
|
||||
@@ -169,4 +181,5 @@ struct monops { /* monitor req opi to ioc */
|
||||
struct mon_info m_info;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif /* __IOCMSG__ */
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ static char *sccsId = "@(#) $Id$";
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#ifdef WIN32
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
@@ -54,7 +54,10 @@ static char *sccsId = "@(#) $Id$";
|
||||
/*
|
||||
* caHostFromInetAddr()
|
||||
*/
|
||||
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
|
||||
void caHostFromInetAddr(
|
||||
const struct in_addr *pnet_addr,
|
||||
char *pBuf,
|
||||
unsigned size)
|
||||
{
|
||||
char *pString;
|
||||
struct hostent *ent;
|
||||
|
||||
@@ -25,7 +25,9 @@
|
||||
* .11 GeG 120992 support VMS/UCX
|
||||
* .12 CJM 130794 define MYERRNO properly for UCX
|
||||
* .13 CJM 311094 mods to support DEC C compiler
|
||||
*
|
||||
* .14 joh 100695 removed UNIX include of filio.h and sockio.h
|
||||
* because they are include by ioctl.h under
|
||||
* BSD and SVR4 (and they dont exist under linux)
|
||||
*/
|
||||
|
||||
#ifndef INCos_depenh
|
||||
@@ -51,6 +53,14 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <netinet/tcp.h>
|
||||
# include <net/if.h>
|
||||
# include <arpa/inet.h>
|
||||
# include <netdb.h>
|
||||
/*
|
||||
* normally these are included by ioctl.h
|
||||
*/
|
||||
# ifdef SOLARIS
|
||||
# include <sys/filio.h>
|
||||
# include <sys/sockio.h>
|
||||
# endif
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif
|
||||
|
||||
@@ -123,16 +133,16 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif /*VMS*/
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#ifdef WIN32
|
||||
# include <errno.h>
|
||||
# include <time.h>
|
||||
# include <windows.h>
|
||||
# include <winsock.h>
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif /*_WINDOWS*/
|
||||
#endif /*WIN32*/
|
||||
|
||||
#ifndef CA_OS_CONFIGURED
|
||||
#error Please define one of vxWorks, UNIX VMS, or _WINDOWS
|
||||
#error Please define one of vxWorks, UNIX, VMS, or WIN32
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -213,6 +223,13 @@ static char *os_depenhSccsId = "$Id$";
|
||||
#define DELAYTICKS 50L /* (adjust units below) */
|
||||
#define TICKSPERSEC 1000L /* mili sec per sec */
|
||||
|
||||
/*
|
||||
* BSD prototypes missing from SUNOS4, MULTINET and
|
||||
* perhaps other environments
|
||||
*/
|
||||
#include <epicsTypes.h>
|
||||
#include <bsdProto.h>
|
||||
|
||||
/*
|
||||
* order of ops is important here
|
||||
*
|
||||
@@ -290,25 +307,26 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# define INVALID_SOCKET (-1)
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
#ifdef WIN32
|
||||
# define LOCK
|
||||
# define UNLOCK
|
||||
# define LOCKEVENTS
|
||||
# define UNLOCKEVENTS
|
||||
# define EVENTLOCKTEST (post_msg_active)
|
||||
# define MAXHOSTNAMELEN 75
|
||||
# define IPPORT_USERRESERVED 5000
|
||||
# define IPPORT_USERRESERVED 5000U
|
||||
# define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
# define ENOBUFS WSAENOBUFS
|
||||
# define ECONNRESET WSAECONNRESET
|
||||
# define ETIMEDOUT WSAETIMEDOUT
|
||||
# define EADDRINUSE WSAEADDRINUSE
|
||||
# define ECONNREFUSED WSAECONNREFUSED
|
||||
# define socket_close(S) closesocket(S)
|
||||
# define socket_ioctl(A,B,C) ioctlsocket(A,B,C)
|
||||
# define MYERRNO WSAGetLastError()
|
||||
# define POST_IO_EV
|
||||
# define SYSFREQ 1000000L /* 1 MHz */
|
||||
#endif /*_WINDOWS*/
|
||||
#endif /*WIN32*/
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.15 1995/08/22 00:22:07 jhill
|
||||
* Dont recompute connection timers if the time stamp hasnt changed
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -53,49 +57,21 @@ void cac_gettimeval(struct timeval *pt)
|
||||
assert(status == 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CAC_MUX_IO()
|
||||
*
|
||||
* Asynch notification of incomming messages under UNIX
|
||||
* 1) Wait no longer than timeout
|
||||
* 2) Return early if nothing outstanding
|
||||
*
|
||||
*
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cac_block_for_io_completion()
|
||||
*/
|
||||
void cac_block_for_io_completion(struct timeval *pTV)
|
||||
{
|
||||
cac_mux_io(pTV);
|
||||
cac_mux_io (pTV);
|
||||
}
|
||||
|
||||
/*
|
||||
* cac_block_for_sg_completion()
|
||||
*/
|
||||
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
{
|
||||
cac_mux_io (pTV);
|
||||
}
|
||||
|
||||
|
||||
@@ -117,12 +93,6 @@ void os_specific_sg_delete(CASG *pcasg)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
{
|
||||
cac_mux_io(pTV);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CAC_ADD_TASK_VARIABLE()
|
||||
@@ -140,17 +110,36 @@ int cac_add_task_variable(struct ca_static *ca_temp)
|
||||
int cac_os_depen_init(struct ca_static *pcas)
|
||||
{
|
||||
int status;
|
||||
struct sigaction sa;
|
||||
|
||||
ca_static = pcas;
|
||||
|
||||
/*
|
||||
* dont allow disconnect to terminate process
|
||||
* when running in UNIX enviroment
|
||||
* when running in UNIX environment
|
||||
*
|
||||
* allow error to be returned to sendto()
|
||||
* instead of handling disconnect at interrupt
|
||||
*/
|
||||
signal(SIGPIPE,SIG_IGN);
|
||||
status = sigaction(SIGPIPE, NULL, &sa);
|
||||
if (status==0) {
|
||||
if (sa.sa_handler == SIG_DFL) {
|
||||
sa.sa_handler = SIG_IGN;
|
||||
status = sigaction(SIGPIPE, &sa, NULL);
|
||||
if (status) {
|
||||
ca_printf(
|
||||
"%s: Error from signal replace was \"%s\"\n",
|
||||
__FILE__,
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
ca_printf(
|
||||
"%s: Error from signal query was \"%s\"\n",
|
||||
__FILE__,
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
|
||||
status = ca_os_independent_init ();
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* REPEATER.C
|
||||
*
|
||||
* CA broadcast repeater
|
||||
@@ -29,7 +31,7 @@
|
||||
* PURPOSE:
|
||||
* Broadcasts fan out over the LAN, but UDP does not allow
|
||||
* two processes on the same machine to get the same broadcast.
|
||||
* This code takes extends the broadcast model from the net to within
|
||||
* This code extends the broadcast model from the net to within
|
||||
* the OS.
|
||||
*
|
||||
* NOTES:
|
||||
@@ -57,29 +59,39 @@
|
||||
* .06 120492 joh removed unnecessary includes
|
||||
* .07 120992 joh now uses dll list routines
|
||||
* .08 102993 joh toggle set sock opt to set
|
||||
* .09 070195 joh discover client has vanished by connecting its
|
||||
* datagram socket (and watching for ECONNREFUSED)
|
||||
*
|
||||
* $Log$
|
||||
*/
|
||||
|
||||
static char *sccsId = "@(#)$Id$";
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
/*
|
||||
* one socket per client so we will get the ECONNREFUSED
|
||||
* error code (and then delete the client)
|
||||
*/
|
||||
struct one_client{
|
||||
ELLNODE node;
|
||||
struct sockaddr_in from;
|
||||
SOCKET sock;
|
||||
};
|
||||
|
||||
/*
|
||||
* these can be external since there is only one instance
|
||||
* per machine so we dont care about reentrancy
|
||||
*/
|
||||
struct one_client{
|
||||
ELLNODE node;
|
||||
struct sockaddr_in from;
|
||||
};
|
||||
|
||||
static ELLLIST client_list;
|
||||
|
||||
static char buf[MAX_UDP];
|
||||
|
||||
LOCAL int clean_client(struct one_client *pclient);
|
||||
LOCAL void register_new_client(SOCKET sock, struct sockaddr_in *pLocal,
|
||||
LOCAL void register_new_client(struct sockaddr_in *pLocal,
|
||||
struct sockaddr_in *pFrom);
|
||||
#define PORT_ANY 0U
|
||||
LOCAL SOCKET makeSocket(unsigned short port);
|
||||
LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize);
|
||||
|
||||
|
||||
/*
|
||||
@@ -93,14 +105,10 @@ void ca_repeater()
|
||||
int status;
|
||||
int size;
|
||||
SOCKET sock;
|
||||
int true = 1;
|
||||
struct sockaddr_in from;
|
||||
struct sockaddr_in bd;
|
||||
struct sockaddr_in local;
|
||||
int from_size = sizeof from;
|
||||
struct one_client *pclient;
|
||||
struct one_client *pnxtclient;
|
||||
short port;
|
||||
unsigned short port;
|
||||
|
||||
port = caFetchPortConfig(
|
||||
&EPICS_CA_REPEATER_PORT,
|
||||
@@ -108,37 +116,20 @@ void ca_repeater()
|
||||
|
||||
ellInit(&client_list);
|
||||
|
||||
/* allocate a socket */
|
||||
sock = socket( AF_INET, /* domain */
|
||||
SOCK_DGRAM, /* type */
|
||||
0); /* deflt proto */
|
||||
assert(sock != INVALID_SOCKET);
|
||||
|
||||
|
||||
memset((char *)&bd, 0, sizeof(bd));
|
||||
bd.sin_family = AF_INET;
|
||||
bd.sin_addr.s_addr = INADDR_ANY;
|
||||
bd.sin_port = htons(port);
|
||||
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
|
||||
if(status<0){
|
||||
if(MYERRNO != EADDRINUSE){
|
||||
ca_printf("CA Repeater: unexpected bind fail %s\n",
|
||||
strerror(MYERRNO));
|
||||
sock = makeSocket(port);
|
||||
if (sock==INVALID_SOCKET) {
|
||||
/*
|
||||
* test for server was already started
|
||||
*/
|
||||
if (MYERRNO==EADDRINUSE) {
|
||||
exit(0);
|
||||
}
|
||||
socket_close(sock);
|
||||
ca_printf("%s: Unable to create repeater socket because \"%s\"\n",
|
||||
__FILE__,
|
||||
strerror(MYERRNO));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
status = setsockopt( sock,
|
||||
SOL_SOCKET,
|
||||
SO_REUSEADDR,
|
||||
(char *)&true,
|
||||
sizeof(true));
|
||||
if(status<0){
|
||||
ca_printf( "%s: set socket option failed\n",
|
||||
__FILE__);
|
||||
}
|
||||
|
||||
status = local_addr(sock, &local);
|
||||
if(status != OK){
|
||||
ca_printf(
|
||||
@@ -162,80 +153,142 @@ void ca_repeater()
|
||||
&from_size);
|
||||
|
||||
if(size < 0){
|
||||
# ifdef linux
|
||||
/*
|
||||
* Avoid spurious ECONNREFUSED bug
|
||||
* in linux
|
||||
*/
|
||||
if (MYERRNO==ECONNREFUSED) {
|
||||
continue;
|
||||
}
|
||||
# endif
|
||||
ca_printf("CA Repeater: recv err %s\n",
|
||||
strerror(MYERRNO));
|
||||
continue;
|
||||
}
|
||||
|
||||
pMsg = (struct extmsg *) buf;
|
||||
|
||||
/*
|
||||
* both zero leng message and a registartion message
|
||||
* both zero length message and a registration message
|
||||
* will register a new client
|
||||
*/
|
||||
if(size >= sizeof(*pMsg)){
|
||||
if(ntohs(pMsg->m_cmmd) == REPEATER_REGISTER){
|
||||
register_new_client(sock, &local, &from);
|
||||
register_new_client(&local, &from);
|
||||
|
||||
/*
|
||||
* strip register client message
|
||||
*/
|
||||
pMsg++;
|
||||
size -= sizeof(*pMsg);
|
||||
if (size==0) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(size == 0){
|
||||
register_new_client(sock, &local, &from);
|
||||
register_new_client(&local, &from);
|
||||
continue;
|
||||
}
|
||||
|
||||
fanOut(&from, (char *) pMsg, size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* fanOut()
|
||||
*/
|
||||
LOCAL void fanOut(struct sockaddr_in *pFrom, const char *pMsg, unsigned msgSize)
|
||||
{
|
||||
ELLLIST theClients;
|
||||
struct one_client *pclient;
|
||||
int status;
|
||||
|
||||
ellInit(&theClients);
|
||||
while (pclient=(struct one_client *)ellGet(&client_list)) {
|
||||
ellAdd(&theClients, &pclient->node);
|
||||
|
||||
/*
|
||||
* size may have been adjusted above
|
||||
* Dont reflect back to sender
|
||||
*/
|
||||
if(size){
|
||||
for( pclient = (struct one_client *)
|
||||
client_list.node.next;
|
||||
pclient;
|
||||
pclient = (struct one_client *)
|
||||
pclient->node.next){
|
||||
if(pFrom->sin_port == pclient->from.sin_port &&
|
||||
pFrom->sin_addr.s_addr == pclient->from.sin_addr.s_addr){
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Dont reflect back to sender
|
||||
*/
|
||||
if(from.sin_port == pclient->from.sin_port &&
|
||||
from.sin_addr.s_addr ==
|
||||
pclient->from.sin_addr.s_addr){
|
||||
continue;
|
||||
}
|
||||
|
||||
status = sendto(
|
||||
sock,
|
||||
(char *)pMsg,
|
||||
size,
|
||||
0,
|
||||
(struct sockaddr *)&pclient->from,
|
||||
sizeof pclient->from);
|
||||
if(status < 0){
|
||||
ca_printf("CA Repeater: fanout err %s\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
status = send(
|
||||
pclient->sock,
|
||||
(char *)pMsg,
|
||||
msgSize,
|
||||
0);
|
||||
if (status>=0) {
|
||||
#ifdef DEBUG
|
||||
ca_printf("Sent\n");
|
||||
ca_printf("Sent to %d\n",
|
||||
pclient->from.sin_port);
|
||||
#endif
|
||||
}
|
||||
if(status < 0){
|
||||
if (MYERRNO == ECONNREFUSED) {
|
||||
#ifdef DEBUG
|
||||
ca_printf("Deleted client %d\n",
|
||||
pclient->from.sin_port);
|
||||
#endif
|
||||
ellDelete(&theClients,
|
||||
&pclient->node);
|
||||
socket_close(pclient->sock);
|
||||
free(pclient);
|
||||
}
|
||||
else {
|
||||
ca_printf(
|
||||
"CA Repeater: fan out err was \"%s\"\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* remove any dead wood prior to pending
|
||||
*/
|
||||
for( pclient = (struct one_client *)
|
||||
client_list.node.next;
|
||||
pclient;
|
||||
pclient = pnxtclient){
|
||||
/* do it now in case item deleted */
|
||||
pnxtclient = (struct one_client *)
|
||||
pclient->node.next;
|
||||
clean_client(pclient);
|
||||
}
|
||||
}
|
||||
ellConcat(&client_list, &theClients);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* makeSocket()
|
||||
*/
|
||||
LOCAL SOCKET makeSocket(unsigned short port)
|
||||
{
|
||||
int status;
|
||||
struct sockaddr_in bd;
|
||||
SOCKET sock;
|
||||
int true = 1;
|
||||
|
||||
sock = socket( AF_INET, /* domain */
|
||||
SOCK_DGRAM, /* type */
|
||||
0); /* deflt proto */
|
||||
if (sock == INVALID_SOCKET) {
|
||||
return sock;
|
||||
}
|
||||
|
||||
status = setsockopt( sock,
|
||||
SOL_SOCKET,
|
||||
SO_REUSEADDR,
|
||||
(char *)&true,
|
||||
sizeof(true));
|
||||
if(status<0){
|
||||
ca_printf( "%s: set socket option failed\n",
|
||||
__FILE__);
|
||||
}
|
||||
|
||||
memset((char *)&bd, 0, sizeof(bd));
|
||||
bd.sin_family = AF_INET;
|
||||
bd.sin_addr.s_addr = INADDR_ANY;
|
||||
bd.sin_port = htons(port);
|
||||
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
|
||||
if(status<0){
|
||||
socket_close(sock);
|
||||
return INVALID_SOCKET;
|
||||
}
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
|
||||
@@ -243,17 +296,17 @@ void ca_repeater()
|
||||
* register_new_client()
|
||||
*/
|
||||
LOCAL void register_new_client(
|
||||
SOCKET sock,
|
||||
struct sockaddr_in *pLocal,
|
||||
struct sockaddr_in *pFrom)
|
||||
{
|
||||
int status;
|
||||
struct one_client *pclient;
|
||||
struct extmsg confirm;
|
||||
struct extmsg noop;
|
||||
|
||||
for( pclient = (struct one_client *) client_list.node.next;
|
||||
for( pclient = (struct one_client *) ellFirst(&client_list);
|
||||
pclient;
|
||||
pclient = (struct one_client *) pclient->node.next){
|
||||
pclient = (struct one_client *) ellNext(&pclient->node)){
|
||||
|
||||
if( pFrom->sin_port == pclient->from.sin_port &&
|
||||
pFrom->sin_addr.s_addr == pclient->from.sin_addr.s_addr)
|
||||
@@ -262,101 +315,73 @@ struct sockaddr_in *pFrom)
|
||||
|
||||
if(!pclient){
|
||||
pclient = (struct one_client *)calloc (1, sizeof(*pclient));
|
||||
if(pclient){
|
||||
pclient->from = *pFrom;
|
||||
ellAdd (&client_list, &pclient->node);
|
||||
#ifdef DEBUG
|
||||
ca_printf (
|
||||
"Added %d\n",
|
||||
pFrom->sin_port);
|
||||
#endif
|
||||
if(!pclient){
|
||||
ca_printf("%s: no memory for new client\n",
|
||||
__FILE__);
|
||||
return;
|
||||
}
|
||||
|
||||
pclient->sock = makeSocket(PORT_ANY);
|
||||
if (!pclient->sock) {
|
||||
free(pclient);
|
||||
ca_printf("%s: no client sock because \"%s\"\n",
|
||||
__FILE__,
|
||||
strerror(MYERRNO));
|
||||
return;
|
||||
}
|
||||
|
||||
status = connect(pclient->sock,
|
||||
(struct sockaddr *)pFrom,
|
||||
sizeof(*pFrom));
|
||||
if (status<0) {
|
||||
socket_close(pclient->sock);
|
||||
free(pclient);
|
||||
ca_printf("%s: unable to connect client sock\n",
|
||||
__FILE__);
|
||||
return;
|
||||
}
|
||||
|
||||
pclient->from = *pFrom;
|
||||
|
||||
ellAdd (&client_list, &pclient->node);
|
||||
#ifdef DEBUG
|
||||
ca_printf (
|
||||
"Added %d\n",
|
||||
pFrom->sin_port);
|
||||
#endif
|
||||
}
|
||||
|
||||
memset((char *)&confirm, 0, sizeof confirm);
|
||||
memset((char *)&confirm, '\0', sizeof(confirm));
|
||||
confirm.m_cmmd = htons(REPEATER_CONFIRM);
|
||||
confirm.m_available = pLocal->sin_addr.s_addr;
|
||||
status = sendto(
|
||||
sock,
|
||||
status = send(
|
||||
pclient->sock,
|
||||
(char *)&confirm,
|
||||
sizeof(confirm),
|
||||
0,
|
||||
(struct sockaddr *)pFrom, /* back to sender */
|
||||
sizeof(*pFrom));
|
||||
if(status != sizeof(confirm)){
|
||||
ca_printf("CA Repeater: confirm err %s\n",
|
||||
strerror(MYERRNO));
|
||||
0);
|
||||
if(status >= 0){
|
||||
assert(status == sizeof(confirm));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* check to see if this client is still around
|
||||
*
|
||||
* NOTE:
|
||||
* This closes the socket only whenever we are
|
||||
* able to bind so that we free the port.
|
||||
*/
|
||||
LOCAL int clean_client(struct one_client *pclient)
|
||||
{
|
||||
static int sockExists;
|
||||
static SOCKET sock;
|
||||
int port = pclient->from.sin_port;
|
||||
struct sockaddr_in bd;
|
||||
int status;
|
||||
int present = FALSE;
|
||||
|
||||
/*
|
||||
* allocate a socket
|
||||
* (no lock required because this is implemented with
|
||||
* a single thread)
|
||||
*/
|
||||
if(!sockExists){
|
||||
sock = socket(
|
||||
AF_INET, /* domain */
|
||||
SOCK_DGRAM, /* type */
|
||||
0); /* deflt proto */
|
||||
if(sock != INVALID_SOCKET){
|
||||
sockExists = TRUE;
|
||||
}
|
||||
else{
|
||||
ca_printf("CA Repeater: no bind test sock err %s\n",
|
||||
strerror(MYERRNO));
|
||||
return OK;
|
||||
}
|
||||
}
|
||||
|
||||
memset((char *)&bd, 0, sizeof(bd));
|
||||
bd.sin_family = AF_INET;
|
||||
bd.sin_addr.s_addr = INADDR_ANY;
|
||||
bd.sin_port = port;
|
||||
status = bind(sock, (struct sockaddr *)&bd, sizeof(bd));
|
||||
if(status>=0){
|
||||
socket_close (sock);
|
||||
sockExists = FALSE;
|
||||
}
|
||||
else{
|
||||
if(MYERRNO == EADDRINUSE){
|
||||
present = TRUE;
|
||||
}
|
||||
else{
|
||||
ca_printf("CA Repeater: client cleanup err %s\n",
|
||||
strerror(MYERRNO));
|
||||
ca_printf("CA Repeater: sock=%d family=%d addr=%x port=%d\n",
|
||||
sock, bd.sin_family, bd.sin_addr.s_addr,
|
||||
bd.sin_port);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!present){
|
||||
else if (MYERRNO == ECONNREFUSED){
|
||||
#ifdef DEBUG
|
||||
ca_printf("Deleted %d\n", pclient->from.sin_port);
|
||||
ca_printf("Deleted repeater client=%d sending ack\n",
|
||||
pFrom->sin_port);
|
||||
#endif
|
||||
ellDelete(&client_list, &pclient->node);
|
||||
socket_close(pclient->sock);
|
||||
free(pclient);
|
||||
}
|
||||
else {
|
||||
ca_printf("CA Repeater: confirm err was \"%s\"\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
|
||||
return OK;
|
||||
/*
|
||||
* send a noop message to all other clients so that we dont
|
||||
* accumulate sockets when there are no beacons
|
||||
*/
|
||||
memset((char *)&noop, '\0', sizeof(noop));
|
||||
confirm.m_cmmd = htons(IOC_NOOP);
|
||||
fanOut(pFrom, (char *)&noop, sizeof(noop));
|
||||
}
|
||||
|
||||
|
||||
130
src/ca/service.c
130
src/ca/service.c
@@ -81,12 +81,12 @@ chid chan
|
||||
|
||||
LOCAL int cacMsg(
|
||||
struct ioc_in_use *piiu,
|
||||
struct in_addr *pnet_addr
|
||||
const struct in_addr *pnet_addr
|
||||
);
|
||||
|
||||
LOCAL void perform_claim_channel(
|
||||
IIU *piiu,
|
||||
struct in_addr *pnet_addr
|
||||
const struct in_addr *pnet_addr
|
||||
);
|
||||
|
||||
#ifdef CONVERSION_REQUIRED
|
||||
@@ -103,7 +103,7 @@ extern CACVRTFUNC *cac_dbr_cvrt[];
|
||||
*/
|
||||
int post_msg(
|
||||
struct ioc_in_use *piiu,
|
||||
struct in_addr *pnet_addr,
|
||||
const struct in_addr *pnet_addr,
|
||||
char *pInBuf,
|
||||
unsigned long blockSize
|
||||
)
|
||||
@@ -236,7 +236,7 @@ unsigned long blockSize
|
||||
*/
|
||||
LOCAL int cacMsg(
|
||||
struct ioc_in_use *piiu,
|
||||
struct in_addr *pnet_addr
|
||||
const struct in_addr *pnet_addr
|
||||
)
|
||||
{
|
||||
evid monix;
|
||||
@@ -263,8 +263,6 @@ struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client write io id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -293,9 +291,8 @@ struct in_addr *pnet_addr
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_write_list, &monix->node);
|
||||
UNLOCK;
|
||||
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
|
||||
break;
|
||||
|
||||
@@ -314,8 +311,6 @@ struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client read notify io id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -366,8 +361,8 @@ struct in_addr *pnet_addr
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_read_list, &monix->node);
|
||||
UNLOCK;
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -385,8 +380,6 @@ struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!monix){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client event id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -398,8 +391,8 @@ struct in_addr *pnet_addr
|
||||
if (!piiu->curMsg.m_postsize) {
|
||||
LOCK;
|
||||
ellDelete(&monix->chan->eventq, &monix->node);
|
||||
UNLOCK;
|
||||
caIOBlockFree(monix);
|
||||
UNLOCK;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -466,8 +459,6 @@ struct in_addr *pnet_addr
|
||||
&piiu->curMsg.m_available);
|
||||
UNLOCK;
|
||||
if(!pIOBlock){
|
||||
ca_signal(ECA_INTERNAL,
|
||||
"bad client read io id from server");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -487,7 +478,8 @@ struct in_addr *pnet_addr
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
# else
|
||||
if (piiu->curMsg.m_type == DBR_STRING) {
|
||||
if (piiu->curMsg.m_type == DBR_STRING &&
|
||||
piiu->curMsg.m_count == 1u) {
|
||||
strcpy ((char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData);
|
||||
}
|
||||
@@ -509,8 +501,8 @@ struct in_addr *pnet_addr
|
||||
}
|
||||
LOCK;
|
||||
ellDelete(&pend_read_list, &pIOBlock->node);
|
||||
UNLOCK;
|
||||
caIOBlockFree(pIOBlock);
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
case IOC_SEARCH:
|
||||
@@ -548,6 +540,7 @@ struct in_addr *pnet_addr
|
||||
|
||||
case IOC_ERROR:
|
||||
{
|
||||
ELLLIST *pList = NULL;
|
||||
evid monix;
|
||||
char nameBuf[64];
|
||||
char context[255];
|
||||
@@ -584,32 +577,30 @@ struct in_addr *pnet_addr
|
||||
*/
|
||||
monix = NULL;
|
||||
args.addr = NULL;
|
||||
LOCK;
|
||||
switch (ntohs(req->m_cmmd)) {
|
||||
case IOC_READ_NOTIFY:
|
||||
LOCK;
|
||||
monix = (evid) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&req->m_available);
|
||||
UNLOCK;
|
||||
pList = &pend_read_list;
|
||||
op = CA_OP_GET;
|
||||
break;
|
||||
case IOC_READ:
|
||||
LOCK;
|
||||
monix = (evid) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&req->m_available);
|
||||
UNLOCK;
|
||||
if(monix){
|
||||
args.addr = monix->usr_arg;
|
||||
}
|
||||
pList = &pend_read_list;
|
||||
op = CA_OP_GET;
|
||||
break;
|
||||
case IOC_WRITE_NOTIFY:
|
||||
LOCK;
|
||||
monix = (evid) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&req->m_available);
|
||||
UNLOCK;
|
||||
pList = &pend_write_list;
|
||||
op = CA_OP_PUT;
|
||||
break;
|
||||
case IOC_WRITE:
|
||||
@@ -619,19 +610,18 @@ struct in_addr *pnet_addr
|
||||
op = CA_OP_SEARCH;
|
||||
break;
|
||||
case IOC_EVENT_ADD:
|
||||
LOCK;
|
||||
monix = (evid) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&req->m_available);
|
||||
UNLOCK;
|
||||
op = CA_OP_ADD_EVENT;
|
||||
if (monix) {
|
||||
pList = &monix->chan->eventq;
|
||||
}
|
||||
break;
|
||||
case IOC_EVENT_CANCEL:
|
||||
LOCK;
|
||||
monix = (evid) bucketLookupItemUnsignedId(
|
||||
pFastBucket,
|
||||
&req->m_available);
|
||||
UNLOCK;
|
||||
op = CA_OP_CLEAR_EVENT;
|
||||
break;
|
||||
default:
|
||||
@@ -640,10 +630,12 @@ struct in_addr *pnet_addr
|
||||
}
|
||||
|
||||
if (monix) {
|
||||
if (pList) {
|
||||
ellDelete(pList, &monix->node);
|
||||
}
|
||||
caIOBlockFree(monix);
|
||||
}
|
||||
|
||||
LOCK;
|
||||
args.chid = bucketLookupItemUnsignedId
|
||||
(pSlowBucket, &piiu->curMsg.m_cid);
|
||||
UNLOCK;
|
||||
@@ -710,6 +702,31 @@ struct in_addr *pnet_addr
|
||||
reconnect_channel(piiu, chan);
|
||||
break;
|
||||
}
|
||||
case IOC_CLAIM_CIU_FAILED:
|
||||
{
|
||||
chid chan;
|
||||
|
||||
LOCK;
|
||||
chan = bucketLookupItemUnsignedId(
|
||||
pSlowBucket, &piiu->curMsg.m_cid);
|
||||
UNLOCK;
|
||||
if(!chan){
|
||||
/*
|
||||
* end up here if they delete the channel
|
||||
* prior to this response
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* need to move the channel back to the cast IIU
|
||||
* (so we will be able to reconnect)
|
||||
*/
|
||||
LOCK;
|
||||
cacDisconnectChannel(chan, FALSE);
|
||||
UNLOCK;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ca_printf("CAC: post_msg(): Corrupt cmd in msg %x\n",
|
||||
piiu->curMsg.m_cmmd);
|
||||
@@ -728,16 +745,18 @@ struct in_addr *pnet_addr
|
||||
*/
|
||||
LOCAL void perform_claim_channel(
|
||||
IIU *piiu,
|
||||
struct in_addr *pnet_addr
|
||||
const struct in_addr *pnet_addr
|
||||
)
|
||||
{
|
||||
int v42;
|
||||
unsigned short port;
|
||||
char rej[64];
|
||||
chid chan;
|
||||
int status;
|
||||
IIU *allocpiiu;
|
||||
IIU *chpiiu;
|
||||
unsigned short *pMinorVersion;
|
||||
unsigned minorVersion;
|
||||
|
||||
/*
|
||||
* ignore broadcast replies for deleted channels
|
||||
@@ -792,8 +811,31 @@ struct in_addr *pnet_addr
|
||||
return;
|
||||
}
|
||||
|
||||
status = alloc_ioc(pnet_addr, &allocpiiu);
|
||||
switch(status){
|
||||
/*
|
||||
* Starting with CA V4.1 the minor version number
|
||||
* is appended to the end of each search reply.
|
||||
* This value is ignored by earlier clients.
|
||||
*/
|
||||
if(piiu->curMsg.m_postsize >= sizeof(*pMinorVersion)){
|
||||
pMinorVersion = (unsigned short *)(piiu->pCurData);
|
||||
minorVersion = ntohs(*pMinorVersion);
|
||||
}
|
||||
else{
|
||||
minorVersion = CA_UKN_MINOR_VERSION;
|
||||
}
|
||||
|
||||
/*
|
||||
* the type field is abused to carry the port number
|
||||
* so that we can have multiple servers on one host
|
||||
*/
|
||||
if (CA_V45 (CA_PROTOCOL_VERSION,minorVersion)) {
|
||||
port = piiu->curMsg.m_type;
|
||||
}
|
||||
else {
|
||||
port = ca_static->ca_server_port;
|
||||
}
|
||||
status = alloc_ioc (pnet_addr, port, &allocpiiu);
|
||||
switch (status) {
|
||||
|
||||
case ECA_NORMAL:
|
||||
break;
|
||||
@@ -801,7 +843,7 @@ struct in_addr *pnet_addr
|
||||
case ECA_DISCONN:
|
||||
/*
|
||||
* This indicates that the connection is tagged
|
||||
* is tagged for shutdown and we are waiting for
|
||||
* for shutdown and we are waiting for
|
||||
* it to go away. Search replies are ignored
|
||||
* in the interim.
|
||||
*/
|
||||
@@ -818,22 +860,11 @@ struct in_addr *pnet_addr
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Starting with CA V4.1 the minor version number
|
||||
* is appended to the end of each search reply.
|
||||
* This value is ignored by earlier clients.
|
||||
*/
|
||||
if(piiu->curMsg.m_postsize >= sizeof(*pMinorVersion)){
|
||||
pMinorVersion = (unsigned short *)(piiu->pCurData);
|
||||
allocpiiu->minor_version_number = ntohs(*pMinorVersion);
|
||||
}
|
||||
else{
|
||||
allocpiiu->minor_version_number = CA_UKN_MINOR_VERSION;
|
||||
}
|
||||
allocpiiu->minor_version_number = minorVersion;
|
||||
|
||||
ellDelete(&chpiiu->chidlist, &chan->node);
|
||||
ellDelete (&chpiiu->chidlist, &chan->node);
|
||||
chan->piiu = allocpiiu;
|
||||
ellAdd(&allocpiiu->chidlist, &chan->node);
|
||||
ellAdd (&allocpiiu->chidlist, &chan->node);
|
||||
ca_static->ca_search_responses++;
|
||||
|
||||
/*
|
||||
@@ -842,7 +873,7 @@ struct in_addr *pnet_addr
|
||||
* the client's name to the server.
|
||||
* (CA V4.1 or higher)
|
||||
*/
|
||||
if(ellCount(&allocpiiu->chidlist)==1){
|
||||
if (ellCount(&allocpiiu->chidlist)==1) {
|
||||
issue_identify_client(allocpiiu);
|
||||
issue_client_host_name(allocpiiu);
|
||||
}
|
||||
@@ -963,9 +994,6 @@ chid chan
|
||||
/* decrement the outstanding IO count */
|
||||
CLRPENDRECV(TRUE);
|
||||
}
|
||||
|
||||
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.17 1995/09/29 22:13:59 jhill
|
||||
* check for nill dbr pointer
|
||||
*
|
||||
* Revision 1.16 1995/08/22 00:27:55 jhill
|
||||
* added cvs style mod log
|
||||
*
|
||||
*
|
||||
* NOTES:
|
||||
* 1) Need to fix if the OP is on a FD that
|
||||
@@ -97,7 +104,7 @@ void ca_sg_shutdown(struct ca_static *ca_temp)
|
||||
/*
|
||||
* ca_sg_create()
|
||||
*/
|
||||
int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
|
||||
int epicsShareAPI ca_sg_create(CA_SYNC_GID *pgid)
|
||||
{
|
||||
int status;
|
||||
CASG *pcasg;
|
||||
@@ -130,29 +137,38 @@ int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
|
||||
*/
|
||||
memset((char *)pcasg,0,sizeof(*pcasg));
|
||||
pcasg->magic = CASG_MAGIC;
|
||||
pcasg->id = CLIENT_SLOW_ID_ALLOC;
|
||||
pcasg->opPendCount = 0;
|
||||
pcasg->seqNo = 0;
|
||||
|
||||
os_specific_sg_create(pcasg);
|
||||
|
||||
status = bucketAddItemUnsignedId(pSlowBucket, &pcasg->id, pcasg);
|
||||
if(status == BUCKET_SUCCESS){
|
||||
do {
|
||||
pcasg->id = CLIENT_SLOW_ID_ALLOC;
|
||||
status = bucketAddItemUnsignedId (pSlowBucket,
|
||||
&pcasg->id, pcasg);
|
||||
} while (status == S_bucket_idInUse);
|
||||
|
||||
if (status == S_bucket_success) {
|
||||
/*
|
||||
* place it on the active sync group list
|
||||
*/
|
||||
ellAdd(&ca_static->activeCASG, &pcasg->node);
|
||||
* place it on the active sync group list
|
||||
*/
|
||||
ellAdd (&ca_static->activeCASG, &pcasg->node);
|
||||
}
|
||||
else{
|
||||
else {
|
||||
/*
|
||||
* place it back on the free sync group list
|
||||
*/
|
||||
ellAdd(&ca_static->freeCASG, &pcasg->node);
|
||||
ellAdd (&ca_static->freeCASG, &pcasg->node);
|
||||
UNLOCK;
|
||||
if (status == S_bucket_noMemory) {
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
else {
|
||||
return ECA_INTERNAL;
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
if(status != BUCKET_SUCCESS){
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
|
||||
*(WRITEABLE_CA_SYNC_GID *)pgid = pcasg->id;
|
||||
return ECA_NORMAL;
|
||||
@@ -162,7 +178,7 @@ int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
|
||||
/*
|
||||
* ca_sg_delete()
|
||||
*/
|
||||
int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
|
||||
int epicsShareAPI ca_sg_delete(CA_SYNC_GID gid)
|
||||
{
|
||||
int status;
|
||||
CASG *pcasg;
|
||||
@@ -183,7 +199,7 @@ int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
|
||||
}
|
||||
|
||||
status = bucketRemoveItemUnsignedId(pSlowBucket, &gid);
|
||||
assert(status == BUCKET_SUCCESS);
|
||||
assert (status == S_bucket_success);
|
||||
|
||||
os_specific_sg_delete(pcasg);
|
||||
|
||||
@@ -200,7 +216,7 @@ int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_block()
|
||||
*/
|
||||
int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
int epicsShareAPI ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
{
|
||||
struct timeval beg_time;
|
||||
ca_real delay;
|
||||
@@ -237,16 +253,11 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
UNLOCK;
|
||||
|
||||
/*
|
||||
* always flush and take care
|
||||
* of connection management
|
||||
* at least once.
|
||||
* always flush at least once.
|
||||
*/
|
||||
ca_flush_io();
|
||||
ca_static->ca_flush_pending = TRUE;
|
||||
|
||||
/*
|
||||
* the current time set within ca_flush_io()
|
||||
* above.
|
||||
*/
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
beg_time = ca_static->currentTime;
|
||||
delay = 0.0;
|
||||
|
||||
@@ -257,9 +268,23 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
|
||||
/*
|
||||
* Exit if the timeout has expired
|
||||
* (dont wait forever for an itsy bitsy
|
||||
* delay which will no be updated if
|
||||
* select is called with no delay)
|
||||
*
|
||||
* current time is only updated by
|
||||
* cac_select_io() if we specify
|
||||
* at least 1 usec to wait
|
||||
*/
|
||||
remaining = timeout-delay;
|
||||
if (remaining<=0.0) {
|
||||
if (remaining<=(1.0/USEC_PER_SEC)) {
|
||||
/*
|
||||
* Make sure that we take care of
|
||||
* recv backlog at least once
|
||||
*/
|
||||
tmo.tv_sec = 0L;
|
||||
tmo.tv_usec = 0L;
|
||||
cac_mux_io (&tmo);
|
||||
status = ECA_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
@@ -276,10 +301,6 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
|
||||
cac_block_for_sg_completion (pcasg, &tmo);
|
||||
|
||||
/*
|
||||
* the current time set within cac_block_for_sg_completion()
|
||||
* above.
|
||||
*/
|
||||
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
|
||||
}
|
||||
pcasg->opPendCount = 0;
|
||||
@@ -291,7 +312,7 @@ int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
/*
|
||||
* ca_sg_reset
|
||||
*/
|
||||
int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
|
||||
int epicsShareAPI ca_sg_reset(CA_SYNC_GID gid)
|
||||
{
|
||||
CASG *pcasg;
|
||||
|
||||
@@ -313,7 +334,7 @@ int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_test
|
||||
*/
|
||||
int APIENTRY ca_sg_test(CA_SYNC_GID gid)
|
||||
int epicsShareAPI ca_sg_test(CA_SYNC_GID gid)
|
||||
{
|
||||
CASG *pcasg;
|
||||
|
||||
@@ -339,7 +360,7 @@ int APIENTRY ca_sg_test(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_array_put()
|
||||
*/
|
||||
int APIENTRY ca_sg_array_put(
|
||||
int epicsShareAPI ca_sg_array_put(
|
||||
CA_SYNC_GID gid,
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -404,7 +425,7 @@ void *pvalue)
|
||||
/*
|
||||
* ca_sg_array_get()
|
||||
*/
|
||||
int APIENTRY ca_sg_array_get(
|
||||
int epicsShareAPI ca_sg_array_get(
|
||||
CA_SYNC_GID gid,
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -505,7 +526,7 @@ LOCAL void io_complete(struct event_handler_args args)
|
||||
* Update the user's variable
|
||||
* (if its a get)
|
||||
*/
|
||||
if(pcasgop->pValue){
|
||||
if(pcasgop->pValue && args.dbr){
|
||||
size = dbr_size_n(args.type, args.count);
|
||||
memcpy(pcasgop->pValue, args.dbr, size);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ static char *sccsId = "$Id$";
|
||||
#include "iocinf.h"
|
||||
|
||||
|
||||
void APIENTRY ca_test_event(struct event_handler_args args)
|
||||
void epicsShareAPI ca_test_event(struct event_handler_args args)
|
||||
{
|
||||
ca_printf("CAC: ~~~### in test event for [%s] ###~~~\n",args.chid+1);
|
||||
ca_printf("CAC: User argument\t%x\n", args.usr);
|
||||
|
||||
@@ -80,7 +80,7 @@ typedef int fd_set ;
|
||||
#define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS)))
|
||||
#define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS)))
|
||||
#define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS)))
|
||||
#define FD_ZERO(p) bzero((char *)(p), sizeof (*(p)))
|
||||
#define FD_ZERO(p) memset((char *)(p), 0, sizeof (*(p)))
|
||||
|
||||
#include <iodef.h>
|
||||
#define IO$_RECEIVE (IO$_WRITEVBLK)
|
||||
|
||||
@@ -28,6 +28,10 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.17 1995/08/22 00:27:56 jhill
|
||||
* added cvs style mod log
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -55,44 +59,6 @@ void cac_gettimeval(struct timeval *pt)
|
||||
assert(status==0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CAC_MUX_IO()
|
||||
*
|
||||
* Wait for send ready under VMS
|
||||
* 1) Wait no longer than timeout
|
||||
*
|
||||
* Under VMS all recv's and input processing
|
||||
* handled by ASTs
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* cac_block_for_io_completion()
|
||||
@@ -286,7 +252,8 @@ void ca_spawn_repeater()
|
||||
* gethostbyaddr(). This makes gethostbyaddr()
|
||||
* hang when it is called from AST level.
|
||||
*/
|
||||
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
|
||||
void caHostFromInetAddr(const struct in_addr *pnet_addr,
|
||||
char *pBuf, unsigned size)
|
||||
{
|
||||
char *pString;
|
||||
|
||||
|
||||
@@ -28,6 +28,13 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
* Revision 1.20 1995/10/12 01:35:31 jhill
|
||||
* Moved cac_mux_io() to iocinf.c
|
||||
*
|
||||
* Revision 1.19 1995/08/22 00:27:58 jhill
|
||||
* added cvs style mod log
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -42,6 +49,7 @@ LOCAL int cac_os_depen_exit_tid (struct ca_static *pcas, int tid);
|
||||
LOCAL int cac_add_task_variable (struct ca_static *ca_temp);
|
||||
LOCAL void deleteCallBack(CALLBACK *pcb);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* cac_gettimeval()
|
||||
@@ -85,40 +93,6 @@ void cac_gettimeval(struct timeval *pt)
|
||||
pt->tv_usec = ((current-sec*rate)*USEC_PER_SEC)/rate;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CAC_MUX_IO()
|
||||
*
|
||||
* Asynch notification of send unblocked for vxWorks
|
||||
* 1) Wait no longer than timeout
|
||||
* 2) Return early if nothing outstanding
|
||||
*
|
||||
*
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
#if NOASYNCRECV
|
||||
cac_clean_iiu_list();
|
||||
#endif
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_SENDS | CA_DO_RECVS);
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
|
||||
#if NOASYNCRECV
|
||||
ca_process_input_queue();
|
||||
manage_conn(TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* cac_block_for_io_completion()
|
||||
@@ -129,7 +103,7 @@ void cac_block_for_io_completion(struct timeval *pTV)
|
||||
unsigned long ticks;
|
||||
unsigned long rate = sysClkRateGet();
|
||||
|
||||
#if NOASYNCRECV
|
||||
#ifdef NOASYNCRECV
|
||||
cac_mux_io(pTV);
|
||||
#else
|
||||
/*
|
||||
@@ -144,6 +118,12 @@ void cac_block_for_io_completion(struct timeval *pTV)
|
||||
ticks = min(LOCALTICKS, ticks);
|
||||
|
||||
semTake(io_done_sem, ticks);
|
||||
/*
|
||||
* force a time update because we are not
|
||||
* going to get one with a nill timeout in
|
||||
* ca_mux_io()
|
||||
*/
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -191,7 +171,7 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
unsigned long ticks;
|
||||
unsigned long rate = sysClkRateGet();
|
||||
|
||||
#if NOASYNCRECV
|
||||
#ifdef NOASYNCRECV
|
||||
cac_mux_io(pTV);
|
||||
#else
|
||||
/*
|
||||
@@ -206,6 +186,12 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
ticks = min(LOCALTICKS, ticks);
|
||||
|
||||
semTake (pcasg->sem, ticks);
|
||||
/*
|
||||
* force a time update because we are not
|
||||
* going to get one with a nill timeout in
|
||||
* ca_mux_io()
|
||||
*/
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -601,7 +587,10 @@ char *localUserName()
|
||||
/*
|
||||
* caHostFromInetAddr()
|
||||
*/
|
||||
void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
|
||||
void caHostFromInetAddr(
|
||||
const struct in_addr *pnet_addr,
|
||||
char *pBuf,
|
||||
unsigned size)
|
||||
{
|
||||
char str[INET_ADDR_LEN];
|
||||
|
||||
@@ -857,17 +846,18 @@ void cac_recv_task(int tid)
|
||||
* ca_task_exit() is called.
|
||||
*/
|
||||
while(TRUE){
|
||||
#if NOASYNCRECV
|
||||
#ifdef NOASYNCRECV
|
||||
taskDelay(60);
|
||||
#else
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout.tv_usec = 50000;
|
||||
/*
|
||||
* NOTE: this must be longer than one vxWorks
|
||||
* tick or we will infinite loop
|
||||
*/
|
||||
timeout.tv_usec = (4*USEC_PER_SEC)/sysClkRateGet();
|
||||
timeout.tv_sec = 0;
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_SENDS | CA_DO_RECVS);
|
||||
|
||||
count = cac_select_io(&timeout, CA_DO_RECVS);
|
||||
ca_process_input_queue();
|
||||
manage_conn(TRUE);
|
||||
#endif
|
||||
|
||||
@@ -27,22 +27,30 @@
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Lawrence Berkley National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
*
|
||||
* $Log$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Windows includes
|
||||
*/
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
#include <mmsystem.h>
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
#ifndef _WINDOWS
|
||||
#error This source is specific to DOS/WINDOS
|
||||
#ifndef WIN32
|
||||
#error This source is specific to WIN32
|
||||
#endif
|
||||
|
||||
long offset_time; /* time diff (sec) between 1970 and when windows started */
|
||||
DWORD prev_time;
|
||||
|
||||
static void init_timers();
|
||||
static int get_subnet_mask ( char SubNetMaskStr[256]);
|
||||
static int RegTcpParams (char IpAddr[256], char SubNetMask[256]);
|
||||
static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
@@ -54,48 +62,25 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
*/
|
||||
void cac_gettimeval(struct timeval *pt)
|
||||
{
|
||||
SYSTEMTIME st;
|
||||
/**
|
||||
The multi-media timers used here should be good to a millisecond
|
||||
resolution. However, since the timer rolls back to 0 every 49.7
|
||||
days (2^32 ms, 4,294,967.296 sec), it's not very good for
|
||||
time stamping over long periods (if Windows is restarted more
|
||||
often than 49 days, it wont be a problem). An attempt is made
|
||||
to keep the time returned increasing, but there is no guarantee
|
||||
the UTC time is right after 49 days.
|
||||
**/
|
||||
|
||||
GetSystemTime(&st);
|
||||
pt->tv_sec = (long)st.wSecond + (long)st.wMinute*60 +
|
||||
(long)st.wHour*360;
|
||||
pt->tv_usec = st.wMilliseconds*1000;
|
||||
}
|
||||
DWORD win_sys_time; /* time (ms) since windows started */
|
||||
|
||||
|
||||
/*
|
||||
* CAC_MUX_IO()
|
||||
*
|
||||
* Asynch notification of incomming messages under UNIX
|
||||
* 1) Wait no longer than timeout
|
||||
* 2) Return early if nothing outstanding
|
||||
*
|
||||
*
|
||||
*/
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
win_sys_time = timeGetTime();
|
||||
if (prev_time > win_sys_time) { /* must have been a timer roll-over */
|
||||
offset_time += 4294967; /* add number of seconds in 49.7 days */
|
||||
}
|
||||
pt->tv_sec = (long)win_sys_time/1000 + offset_time; /* time (sec) since 1970 */
|
||||
pt->tv_usec = (long)((win_sys_time % 1000) * 1000);
|
||||
prev_time = win_sys_time;
|
||||
}
|
||||
|
||||
|
||||
@@ -138,8 +123,7 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
*/
|
||||
int cac_os_depen_init(struct ca_static *pcas)
|
||||
{
|
||||
int status;
|
||||
WSADATA WsaData;
|
||||
int status;
|
||||
|
||||
ca_static = pcas;
|
||||
|
||||
@@ -153,10 +137,7 @@ int cac_os_depen_init(struct ca_static *pcas)
|
||||
|
||||
/* signal(SIGPIPE,SIG_IGN); */
|
||||
|
||||
# ifdef _WINSOCKAPI_
|
||||
status = WSAStartup(MAKEWORD(1,1), &WsaData);
|
||||
assert (status==0);
|
||||
# endif
|
||||
/* DllMain does most OS dependent init & cleanup */
|
||||
|
||||
status = ca_os_independent_init ();
|
||||
|
||||
@@ -290,11 +271,8 @@ int local_addr (SOCKET s, struct sockaddr_in *plcladdr)
|
||||
*/
|
||||
void caDiscoverInterfaces(ELLLIST *pList, SOCKET socket, int port)
|
||||
{
|
||||
struct sockaddr_in localAddr;
|
||||
struct sockaddr_in InetAddr;
|
||||
struct in_addr bcast_addr;
|
||||
caAddrNode *pNode;
|
||||
int status;
|
||||
|
||||
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
|
||||
if(!pNode){
|
||||
@@ -352,6 +330,13 @@ static int get_subnet_mask ( char SubNetMaskStr[256])
|
||||
return RegTcpParams (localadr, SubNetMaskStr);
|
||||
}
|
||||
|
||||
/* For NT 3.51, enumerates network interfaces returns the ip address */
|
||||
/* and subnet mask for the LAST interface found. This needs to be changed */
|
||||
/* to work in conjuction with caDiscoverInterfaces to add all the */
|
||||
/* add all the interfaces to the elist. Also could be more efficient in
|
||||
calling */
|
||||
/* RegKeyOpen */
|
||||
|
||||
static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
|
||||
{
|
||||
#define MAX_VALUE_NAME 128
|
||||
@@ -360,37 +345,65 @@ static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
|
||||
DWORD cbDataLen;
|
||||
CHAR cbData[256];
|
||||
DWORD dwType;
|
||||
int status;
|
||||
int status, i, card_cnt;
|
||||
char *pNetCard[16], *pData;
|
||||
|
||||
static char IpAddr[256], SubNetMask[256];
|
||||
|
||||
cbDataLen = sizeof(cbData);
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\1");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
|
||||
|
||||
/****
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows
|
||||
NT\\CurrentVersion\\NetworkCards\\1");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType,
|
||||
cbData, &cbDataLen);
|
||||
if (status) {
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\01");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows
|
||||
NT\\CurrentVersion\\NetworkCards\\01");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType,
|
||||
cbData, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
****/
|
||||
|
||||
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\");
|
||||
strcat(RegPath,cbData);
|
||||
strcat(RegPath,"\\Parameters\\Tcpip");
|
||||
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "Route", &dwType, cbData,
|
||||
&cbDataLen);
|
||||
if (status) {
|
||||
return status;
|
||||
}
|
||||
|
||||
i=0; card_cnt = 0; pData = cbData; /* enumerate network interfaces */
|
||||
|
||||
while( i < 16 && (pNetCard[i]=strtok(pData,"\"")) ) {
|
||||
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\");
|
||||
strcat(RegPath,pNetCard[i]);
|
||||
strcat(RegPath,"\\Parameters\\Tcpip");
|
||||
|
||||
cbDataLen = sizeof(IpAddr);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "IPAddress", &dwType,
|
||||
IpAddr, &cbDataLen);
|
||||
if (status == 0) {
|
||||
cbDataLen = sizeof(SubNetMask);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "SubnetMask",
|
||||
&dwType, SubNetMask, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
card_cnt++;
|
||||
}
|
||||
pData += strlen(pNetCard[i])+3;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (card_cnt == 0)
|
||||
return 1;
|
||||
|
||||
cbDataLen = sizeof(IpAddr);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "IPAddress", &dwType, IpAddr, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
strcpy(IpAddrStr,IpAddr);
|
||||
|
||||
cbDataLen = sizeof(SubNetMask);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "SubnetMask", &dwType, SubNetMask, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
strcpy(SubNetMaskStr,SubNetMask);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -417,7 +430,7 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
}
|
||||
|
||||
|
||||
retCode = RegQueryValueEx (hKey, // Key handle returned from RegOpenKeyEx.
|
||||
retCode = RegQueryValueEx (hKey, // Key handle returned from
|
||||
lpzValueName, // Name of value.
|
||||
NULL, // Reserved, dword = NULL.
|
||||
lpdwType, // Type of data.
|
||||
@@ -434,36 +447,61 @@ static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||
BOOL epicsShareAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||
{
|
||||
int status;
|
||||
WSADATA WsaData;
|
||||
TIMECAPS tc;
|
||||
UINT wTimerRes;
|
||||
|
||||
switch (dwReason) {
|
||||
|
||||
case DLL_PROCESS_ATTACH:
|
||||
|
||||
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0)
|
||||
return FALSE;
|
||||
|
||||
#if _DEBUG /* for gui applications, setup console for error messages */
|
||||
if (AllocConsole()) {
|
||||
SetConsoleTitle("Channel Access Status");
|
||||
freopen( "CONOUT$", "a", stderr );
|
||||
fprintf(stderr, "Process attached to ca.dll R12\n");
|
||||
}
|
||||
fprintf(stderr, "Process attached to ca.dll R3.12.1\n");
|
||||
#endif /* init. winsock */
|
||||
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0) {
|
||||
fprintf(stderr,"Cant init winsock \n");
|
||||
return FALSE;
|
||||
}
|
||||
/* setup multi-media timer */
|
||||
if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) {
|
||||
fprintf(stderr,"cant get timer info \n");
|
||||
return FALSE;
|
||||
}
|
||||
/* set for 1 ms resoulution */
|
||||
wTimerRes = min(max(tc.wPeriodMin, 1), tc.wPeriodMax);
|
||||
status = timeBeginPeriod(wTimerRes);
|
||||
if (status != TIMERR_NOERROR)
|
||||
fprintf(stderr,"timer setup failed\n");
|
||||
offset_time = (long)time(NULL) - (long)timeGetTime()/1000;
|
||||
prev_time = timeGetTime();
|
||||
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
|
||||
timeEndPeriod(wTimerRes);
|
||||
|
||||
if ((status = WSACleanup()) !=0)
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
fprintf(stderr, "Thread attached to ca.dll R12\n");
|
||||
#if _DEBUG
|
||||
fprintf(stderr, "Thread attached to ca.dll R3.12.1\n");
|
||||
#endif
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
fprintf(stderr, "Thread detached from ca.dll R12\n");
|
||||
#if _DEBUG
|
||||
fprintf(stderr, "Thread detached from ca.dll R3.12.1\n");
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -472,4 +510,8 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
18
src/cvtDctsdr/Makefile
Normal file
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
|
||||
@@ -4127,16 +4127,16 @@ FILE *fp;
|
||||
}
|
||||
|
||||
/* Beginning of Process Variable Directory Routines*/
|
||||
#define HASH_NO 512 /* number of hash table entries */
|
||||
#define HASH_NO 2048 /* number of hash table entries */
|
||||
#define SHIFT 3 /*number of bits to shift*/
|
||||
|
||||
|
||||
/*The hash algorithm is a modification of the algorithm described in */
|
||||
/* Fast Hashing of Variable Length Text Strings, Peter K. Pearson, */
|
||||
/* Communications of the ACM, June 1990 */
|
||||
/* The modifications were desdigned by Marty Kraimer and Ben Chin Cha */
|
||||
/* The mods were implemented and tested by Ben Chin Cha */
|
||||
/* The modifications were designed by Marty Kraimer */
|
||||
|
||||
static unsigned char T0[256] = {
|
||||
static unsigned char T[256] = {
|
||||
39,159,180,252, 71, 6, 13,164,232, 35,226,155, 98,120,154, 69,
|
||||
157, 24,137, 29,147, 78,121, 85,112, 8,248,130, 55,117,190,160,
|
||||
176,131,228, 64,211,106, 38, 27,140, 30, 88,210,227,104, 84, 77,
|
||||
@@ -4155,45 +4155,24 @@ static unsigned char T0[256] = {
|
||||
134, 68, 93,183,241, 81,196, 49,192, 65,212, 94,203, 10,200, 47
|
||||
};
|
||||
|
||||
static unsigned char T1[256] = {
|
||||
9,139,209, 40, 31,202, 58,179,116, 33,207,146, 76, 60,242,124,
|
||||
254,197, 80,167,153,145,129,233,132, 48,246, 86,156,177, 36,187,
|
||||
45, 1, 96, 18, 19, 62,185,234, 99, 16,218, 95,128,224,123,253,
|
||||
42,109, 4,247, 72, 5,151,136, 0,152,148,127,204,133, 17, 14,
|
||||
182,217, 54,199,119,174, 82, 57,215, 41,114,208,206,110,239, 23,
|
||||
189, 15, 3, 22,188, 79,113,172, 28, 2,222, 21,251,225,237,105,
|
||||
102, 32, 56,181,126, 83,230, 53,158, 52, 59,213,118,100, 67,142,
|
||||
220,170,144,115,205, 26,125,168,249, 66,175, 97,255, 92,229, 91,
|
||||
214,236,178,243, 46, 44,201,250,135,186,150,221,163,216,162, 43,
|
||||
11,101, 34, 37,194, 25, 50, 12, 87,198,173,240,193,171,143,231,
|
||||
111,141,191,103, 74,245,223, 20,161,235,122, 63, 89,149, 73,238,
|
||||
134, 68, 93,183,241, 81,196, 49,192, 65,212, 94,203, 10,200, 47,
|
||||
39,159,180,252, 71, 6, 13,164,232, 35,226,155, 98,120,154, 69,
|
||||
157, 24,137, 29,147, 78,121, 85,112, 8,248,130, 55,117,190,160,
|
||||
176,131,228, 64,211,106, 38, 27,140, 30, 88,210,227,104, 84, 77,
|
||||
75,107,169,138,195,184, 70, 90, 61,166, 7,244,165,108,219, 51,
|
||||
};
|
||||
|
||||
#ifdef __STDC__
|
||||
static unsigned short hash( char *pname, int length)
|
||||
#else
|
||||
static unsigned short hash( pname, length)
|
||||
char *pname;
|
||||
int length;
|
||||
#endif /*__STDC__*/
|
||||
{
|
||||
unsigned short h=0;
|
||||
unsigned short hret;
|
||||
unsigned char *h0=(unsigned char *)&h;
|
||||
unsigned char *h1= h0 + 1;
|
||||
unsigned char h0=0;
|
||||
unsigned char h1=0;
|
||||
unsigned short ind0,ind1;
|
||||
int even = TRUE;
|
||||
unsigned char c;
|
||||
int i;
|
||||
|
||||
for(i=0; i<length; i+=2, pname+=2) {
|
||||
*h0 = T0[*h0 ^ *pname];
|
||||
*h1 = T1[*h1 ^ *(pname+1)];
|
||||
for(i=0; i<length; i++, pname++) {
|
||||
c = *pname;
|
||||
if(even) {h0 = T[h0^c]; even = FALSE;}
|
||||
else {h1 = T[h1^c]; even = TRUE;}
|
||||
}
|
||||
hret = *h0;
|
||||
return(hret + *h1);
|
||||
ind0 = (unsigned short)h0;
|
||||
ind1 = (unsigned short)h1;
|
||||
return((ind1<<SHIFT) ^ ind0);
|
||||
}
|
||||
|
||||
#ifdef __STDC__
|
||||
282
src/cvtDctsdr/dbStaticLib.h
Normal file
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.ascii");
|
||||
fp = fopen(pfilename,"w");
|
||||
if(!fp) {
|
||||
printf("Error opening file %s\n",pfilename);
|
||||
exit(-1);
|
||||
}
|
||||
precType = pdbbase->precType;
|
||||
precDevSup = pdbbase->precDevSup;
|
||||
pdevChoiceRec = pdbbase->pchoiceDev;
|
||||
for(i=0; i<precType->number; i++) {
|
||||
pdevSup = precDevSup->papDevSup[i];
|
||||
if(!pdevSup) continue;
|
||||
pdevChoiceSet = pdevChoiceRec->papDevChoiceSet[i];
|
||||
if(!pdevChoiceSet) continue;
|
||||
for(j=0; j<pdevSup->number; j++) {
|
||||
if(!pdevSup->papDsetName[j]) continue;
|
||||
pdevChoice = pdevChoiceSet->papDevChoice[j];
|
||||
if(!pdevChoice) continue;
|
||||
fprintf(fp,"device(%s,%s,%s,\"%s\")\n",
|
||||
precType->papName[i],
|
||||
plink_type_name[pdevChoice->link_type],
|
||||
pdevSup->papDsetName[j],
|
||||
pdevChoice->pchoice);
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
return(0);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*atodb.c*/
|
||||
/* share/src/db @(#)atdb.c 1.7 2/25/94 */
|
||||
/*sdr2driver.c*/
|
||||
/* Convert driver support to new ascii formats*/
|
||||
/*
|
||||
*
|
||||
* Author: Marty Kraimer
|
||||
@@ -27,7 +27,7 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* .01 07-13-93 mrk Original version
|
||||
* .01 05-10-95 mrk Original Version
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -37,57 +37,48 @@
|
||||
#include <errMdef.h>
|
||||
#include <dbDefs.h>
|
||||
#include <dbStaticLib.h>
|
||||
#include <drvSup.h>
|
||||
DBBASE *pdbbase;
|
||||
DBENTRY *pdbentry;
|
||||
|
||||
#ifdef __STDC__
|
||||
main(int argc,char **argv)
|
||||
#else
|
||||
main(argc,argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
#endif /*__STDC__*/
|
||||
{
|
||||
FILE *fpdctsdr;
|
||||
FILE *fp;
|
||||
long status;
|
||||
char *ptime;
|
||||
time_t timeofday;
|
||||
char *rectype;
|
||||
|
||||
|
||||
if(argc!=3) {
|
||||
printf("Usage: atdb default.dctsdr file.database < file.rpt\n");
|
||||
exit(-1);
|
||||
static char *defdctsdr = "default.dctsdr";
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
FILE *fp;
|
||||
long status;
|
||||
char *sdr_filename;
|
||||
char filename[40];
|
||||
char *pfilename = filename;
|
||||
struct drvSup *pdrvSup;
|
||||
int i,j;
|
||||
|
||||
if(argc==2) {
|
||||
sdr_filename = argv[1];
|
||||
} else {
|
||||
sdr_filename = defdctsdr;
|
||||
}
|
||||
fpdctsdr = fopen(argv[1],"r");
|
||||
if(!fpdctsdr) {
|
||||
errMessage(0,"Error opening input file");
|
||||
exit(-1);
|
||||
}
|
||||
if(fopen(argv[2],"r")) {
|
||||
errMessage(-1,"Output File already exists");
|
||||
fp = fopen(sdr_filename,"r");
|
||||
if(!fp) {
|
||||
printf("Error opening file %s\n",sdr_filename);
|
||||
exit(-1);
|
||||
}
|
||||
pdbbase=dbAllocBase();
|
||||
pdbentry=dbAllocEntry(pdbbase);
|
||||
status=dbRead(pdbbase,fpdctsdr);
|
||||
status=dbRead(pdbbase,fp);
|
||||
if(status) {
|
||||
errMessage(status,"dbRead");
|
||||
exit(-1);
|
||||
}
|
||||
yyreset();
|
||||
yyparse();
|
||||
fp=fopen(argv[2],"w");
|
||||
if(fp==NULL) {
|
||||
errMessage(0,"Error opening output file");
|
||||
exit(-1);
|
||||
}
|
||||
status = dbWrite(pdbbase,fpdctsdr,fp);
|
||||
if(status) errMessage(status,"dbWrite");
|
||||
fclose(fpdctsdr);
|
||||
fclose(fp);
|
||||
dbFreeEntry(pdbentry);
|
||||
dbFreeBase(pdbbase);
|
||||
strcpy(pfilename,"driver.ascii");
|
||||
fp = fopen(pfilename,"w");
|
||||
if(!fp) {
|
||||
printf("Error opening file %s\n",pfilename);
|
||||
exit(-1);
|
||||
}
|
||||
pdrvSup = pdbbase->pdrvSup;
|
||||
for(i=0; i<pdrvSup->number; i++) {
|
||||
fprintf(fp,"driver(%s)\n",pdrvSup->papDrvName[i]);
|
||||
}
|
||||
fclose(fp);
|
||||
return(0);
|
||||
}
|
||||
115
src/cvtDctsdr/sdr2gblmenu.c
Normal file
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,".ascii");
|
||||
fp = fopen(pfilename,"w");
|
||||
if(!fp) {
|
||||
printf("Error opening file %s\n",pfilename);
|
||||
exit(-1);
|
||||
}
|
||||
pchoiceSet = pdbbase->pchoiceGbl->papChoiceSet[i];
|
||||
fprintf(fp,"menu(%s) {\n",aiMenuName[i]);
|
||||
for(j=0; j<pchoiceSet->number; j++) {
|
||||
strcpy(temp_str,pchoiceSet->papChoice[j]);
|
||||
ptemp = temp_str;
|
||||
while(*ptemp) {
|
||||
if(!isalnum(*ptemp)) *ptemp = '_';
|
||||
ptemp++;
|
||||
}
|
||||
sprintf(choice_name,"%s%s",aiMenuName[i],temp_str);
|
||||
fprintf(fp,"\tchoice(%s,\"%s\")\n",
|
||||
choice_name,pchoiceSet->papChoice[j]);
|
||||
}
|
||||
fprintf(fp,"}\n");
|
||||
fclose(fp);
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
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,".ascii");
|
||||
fp = fopen(pfilename,"w");
|
||||
if(!fp) {
|
||||
fprintf(stderr,"Error opening file %s\n",pfilename);
|
||||
exit(-1);
|
||||
}
|
||||
/*Create record instance with initial values*/
|
||||
dbInitEntry(pdbbase,pdbentry);
|
||||
status = dbFindRecdes(pdbentry,precType->papName[indRectype]);
|
||||
if(status) {printf("No record description\n"); exit(-1);}
|
||||
status = dbCreateRecord(pdbentry,"temp");
|
||||
if(status) {printf("dbCreateRecord failed\n"); exit(-1);}
|
||||
/*For menus let name be <recordtype><fieldname> */
|
||||
precTypDes = pdbbase->precDes->papRecTypDes[indRectype];
|
||||
parrChoiceSet = pdbbase->pchoiceRec->papArrChoiceSet[indRectype];
|
||||
if(!parrChoiceSet) goto gen_rectype;
|
||||
if(makeCommon) goto gen_rectype;
|
||||
paprecChoiceNames = (char **)calloc(parrChoiceSet->number,sizeof(char *));
|
||||
for(i=0; i< parrChoiceSet->number; i++) {
|
||||
/*Find first field that uses this choice set */
|
||||
for(j=0; j< precTypDes->no_fields; j++) {
|
||||
pfldDes = precTypDes->papFldDes[j];
|
||||
if(pfldDes->field_type==DBF_RECCHOICE
|
||||
&& pfldDes->choice_set==i) break;
|
||||
}
|
||||
if(j>=precTypDes->no_fields) continue;
|
||||
strcpy(pmenuname,recordtypeName);
|
||||
strcat(pmenuname,pfldDes->fldname);
|
||||
for(j=strlen(pmenuname)-1; j>0; j--) {
|
||||
if(pmenuname[j] == ' ') pmenuname[j] = 0;
|
||||
}
|
||||
paprecChoiceNames[i] = calloc(1,strlen(pmenuname) + 1);
|
||||
strcpy(paprecChoiceNames[i],pmenuname);
|
||||
fprintf(fp,"menu(%s) {\n",pmenuname);
|
||||
pchoiceSet = parrChoiceSet->papChoiceSet[i];
|
||||
for(j=0; j<pchoiceSet->number; j++) {
|
||||
strcpy(tempStr,pchoiceSet->papChoice[j]);
|
||||
ptemp = tempStr;
|
||||
while(*ptemp) {
|
||||
if(!isalnum(*ptemp)) *ptemp = '_';
|
||||
ptemp++;
|
||||
}
|
||||
sprintf(choiceName,"%s_%s",pmenuname,tempStr);
|
||||
fprintf(fp,"\tchoice(%s,\"%s\")\n",
|
||||
choiceName,pchoiceSet->papChoice[j]);
|
||||
}
|
||||
fprintf(fp,"}\n");
|
||||
}
|
||||
gen_rectype:
|
||||
if(makeCommon) {
|
||||
indFldDes=-1;
|
||||
} else {
|
||||
fprintf(fp,"recordtype(%s) {\n",recordtypeName);
|
||||
fprintf(fp,"\tinclude \"dbCommon.ascii\" \n");
|
||||
/*Skip fields in dbCommon*/
|
||||
for(indFldDes=0; indFldDes< precTypDes->no_fields; indFldDes++) {
|
||||
if(strcmp(precTypDes->papFldDes[indFldDes]->fldname,"FLNK")==0) break;
|
||||
}
|
||||
}
|
||||
while(++indFldDes < precTypDes->no_fields) {
|
||||
pfldDes = precTypDes->papFldDes[indFldDes];
|
||||
if(pfldDes->field_type==DBF_NOACCESS) {
|
||||
char *prtn;
|
||||
char fldname[5];
|
||||
|
||||
strcpy(fldname,pfldDes->fldname);
|
||||
pstr = fldname;
|
||||
while(*pstr) {
|
||||
if(*pstr == ' ') {
|
||||
*pstr = 0;
|
||||
break;
|
||||
}
|
||||
*pstr = tolower(*pstr);
|
||||
pstr++;
|
||||
}
|
||||
while(TRUE) {
|
||||
prtn = fgets(includeLine,80,fpInclude);
|
||||
if(!prtn) {
|
||||
fprintf(stderr, "field %s not found in %s\n",
|
||||
pfldDes->fldname,recordtypeInclude);
|
||||
break;
|
||||
}
|
||||
if(!(pstr = strstr(includeLine,fldname))) continue;
|
||||
if(isalnum(*(pstr + strlen(fldname)))) continue;
|
||||
break;
|
||||
}
|
||||
if(!prtn) continue;
|
||||
if(strstr(pstr,"Created Pad")) continue;
|
||||
}
|
||||
strcpy(tempStr,pfldDes->fldname);
|
||||
for(j=strlen(tempStr)-1; j>0; j--) {
|
||||
if(tempStr[j] == ' ') tempStr[j] = 0;
|
||||
}
|
||||
fprintf(fp,"\tfield(%s,%s) {\n",
|
||||
tempStr,ptypename[pfldDes->field_type]);
|
||||
if(pfldDes->prompt[0]!=0) {
|
||||
fprintf(fp,"\t\tprompt(\"%s\")\n",pfldDes->prompt);
|
||||
}
|
||||
if(pfldDes->promptflag) {
|
||||
fprintf(fp,"\t\tpromptgroup(%s)\n",pguigroup[pfldDes->promptflag]);
|
||||
}
|
||||
if(pfldDes->as_level == 0) fprintf(fp,"\t\tasl(ASL0)\n");
|
||||
if(pfldDes->special) {
|
||||
fprintf(fp,"\t\tspecial(");
|
||||
switch(pfldDes->special) {
|
||||
case SPC_NOMOD: fprintf(fp,"SPC_NOMOD)\n"); break;
|
||||
case SPC_DBADDR: fprintf(fp,"SPC_DBADDR)\n"); break;
|
||||
case SPC_SCAN: fprintf(fp,"SPC_SCAN)\n"); break;
|
||||
case SPC_HDWLINK: fprintf(fp,"SPC_HDWLINK)\n"); break;
|
||||
case SPC_ALARMACK: fprintf(fp,"SPC_ALARMACK)\n"); break;
|
||||
case SPC_AS: fprintf(fp,"SPC_AS)\n"); break;
|
||||
case SPC_MOD: fprintf(fp,"SPC_MOD)\n"); break;
|
||||
case SPC_RESET: fprintf(fp,"SPC_RESET)\n"); break;
|
||||
case SPC_LINCONV: fprintf(fp,"SPC_LINCONV)\n"); break;
|
||||
case SPC_CALC: fprintf(fp,"SPC_CALC)\n"); break;
|
||||
default : fprintf(fp,"%d)\n",pfldDes->special);
|
||||
}
|
||||
}
|
||||
if(pfldDes->process_passive) fprintf(fp,"\t\tpp(TRUE)\n");
|
||||
if(pfldDes->cvt_type) fprintf(fp,"\t\tbase(HEX)\n");
|
||||
if(pfldDes->interest)
|
||||
fprintf(fp,"\t\tinterest(%d)\n",pfldDes->interest);
|
||||
switch(pfldDes->field_type) {
|
||||
case DBF_STRING: {
|
||||
fprintf(fp,"\t\tsize(%d)\n",pfldDes->size);
|
||||
}
|
||||
break;
|
||||
case DBF_CHAR: {
|
||||
status = dbFindField(pdbentry,pfldDes->fldname);
|
||||
if(status) {printf("dbFindField failed\n"); exit(-1);}
|
||||
pstr = dbGetString(pdbentry);
|
||||
if(pfldDes->initial.char_value)
|
||||
fprintf(fp,"\t\tinitial(\"%d\")\n",
|
||||
pfldDes->initial.char_value);
|
||||
}
|
||||
break;
|
||||
case DBF_UCHAR: {
|
||||
if(pfldDes->initial.uchar_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.uchar_value);
|
||||
}
|
||||
break;
|
||||
case DBF_SHORT: {
|
||||
if(pfldDes->initial.short_value)
|
||||
fprintf(fp,"\t\tinitial(\"%d\")\n",
|
||||
pfldDes->initial.short_value);
|
||||
}
|
||||
break;
|
||||
case DBF_USHORT: {
|
||||
if(pfldDes->initial.ushort_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ushort_value);
|
||||
}
|
||||
break;
|
||||
case DBF_LONG: {
|
||||
if(pfldDes->initial.long_value)
|
||||
fprintf(fp,"\t\tinitial(\"%d\")\n",
|
||||
pfldDes->initial.long_value);
|
||||
}
|
||||
break;
|
||||
case DBF_ULONG: {
|
||||
if(pfldDes->initial.ulong_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ulong_value);
|
||||
}
|
||||
break;
|
||||
case DBF_FLOAT: {
|
||||
if(pfldDes->initial.float_value)
|
||||
fprintf(fp,"\t\tinitial(\"%g\")\n",
|
||||
pfldDes->initial.float_value);
|
||||
}
|
||||
break;
|
||||
case DBF_DOUBLE: {
|
||||
if(pfldDes->initial.double_value)
|
||||
fprintf(fp,"\t\tinitial(\"%g\")\n",
|
||||
pfldDes->initial.double_value);
|
||||
}
|
||||
break;
|
||||
case DBF_ENUM: {
|
||||
if(pfldDes->initial.enum_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.enum_value);
|
||||
}
|
||||
break;
|
||||
case DBF_GBLCHOICE: {
|
||||
fprintf(fp,"\t\tmenu(%s)\n",pgblMenuNames[pfldDes->choice_set]);
|
||||
if(pfldDes->initial.ushort_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ushort_value);
|
||||
}
|
||||
break;
|
||||
case DBF_CVTCHOICE: {
|
||||
fprintf(fp,"\t\tmenu(menuConvert)\n");
|
||||
if(pfldDes->initial.ushort_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ushort_value);
|
||||
}
|
||||
break;
|
||||
case DBF_RECCHOICE: {
|
||||
fprintf(fp,"\t\tmenu(%s)\n",paprecChoiceNames[pfldDes->choice_set]);
|
||||
if(pfldDes->initial.ushort_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ushort_value);
|
||||
}
|
||||
break;
|
||||
case DBF_DEVCHOICE: {
|
||||
if(pfldDes->initial.ushort_value)
|
||||
fprintf(fp,"\t\tinitial(\"%u\")\n",
|
||||
pfldDes->initial.ushort_value);
|
||||
}
|
||||
break;
|
||||
case DBF_INLINK: {
|
||||
}
|
||||
break;
|
||||
case DBF_OUTLINK: {
|
||||
}
|
||||
break;
|
||||
case DBF_FWDLINK: {
|
||||
}
|
||||
break;
|
||||
case DBF_NOACCESS: { /*includeLine holds definition*/
|
||||
char *ptempStr = tempStr;
|
||||
|
||||
fprintf(fp,"\t\tsize(%d)\n",pfldDes->size);
|
||||
ptemp = includeLine;
|
||||
while(*ptemp==' ' || *ptemp=='\t') ptemp++;
|
||||
while(*ptemp!=';') *ptempStr++ = *ptemp++;
|
||||
*ptempStr = 0;
|
||||
fprintf(fp,"\t\textra(\"%s\")\n",tempStr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
fprintf(fp,"\t}\n");
|
||||
if(makeCommon
|
||||
&& (strcmp(precTypDes->papFldDes[indFldDes]->fldname,"FLNK")==0))
|
||||
break;
|
||||
}
|
||||
if(!makeCommon)fprintf(fp,"}\n");
|
||||
fclose(fpInclude);
|
||||
fclose(fp);
|
||||
return(0);
|
||||
}
|
||||
80
src/cvtDctsdr/sdrHeader.h
Normal file
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
|
||||
@@ -1,45 +0,0 @@
|
||||
EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_LDLIBS = -lDb -lCom -lm
|
||||
USR_LDFLAGS = -L.
|
||||
|
||||
LEX = $(ELEX)
|
||||
YACC = $(EYACC)
|
||||
YACCOPT = -l
|
||||
LEXOPT = -L
|
||||
|
||||
DEPLIBS_BASE = $(EPICS_BASE_LIB)
|
||||
DEPLIBS = ./libDb.a\
|
||||
$(DEPLIBS_BASE)/libCom.a
|
||||
# $(DEPLIBS_BASE)/libDb.a
|
||||
|
||||
|
||||
SRCS.c = \
|
||||
../dbStaticLib.c \
|
||||
atdb_yacc.c \
|
||||
../dbta.c \
|
||||
../dbl.c \
|
||||
../dbls.c
|
||||
|
||||
|
||||
LIBOBJS = dbStaticLib.o
|
||||
|
||||
LIBNAME = libDb.a
|
||||
|
||||
PROD = atdb dbl dbls dbta
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
|
||||
atdb: atdb_yacc.o $(DEPLIBS)
|
||||
$(LINK.c) -o $@ atdb_yacc.o $(LDLIBS)
|
||||
|
||||
# Extra rule since atdb_lex.c is included in atdb_yacc.c
|
||||
# In my opinion, these objects should really be built
|
||||
# independently.
|
||||
atdb_yacc.o: atdb_lex.c ../atdb.c
|
||||
|
||||
clean::
|
||||
@$(RM) atdb_lex.c atdb_yacc.c
|
||||
|
||||
@@ -2,27 +2,78 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -ansi
|
||||
VX_WARN_YES = -Wall -pedantic
|
||||
|
||||
MENUS += menuAlarmSevr.h
|
||||
MENUS += menuAlarmStat.h
|
||||
MENUS += menuArrType.h
|
||||
MENUS += menuCompress.h
|
||||
MENUS += menuFtype.h
|
||||
MENUS += menuIvoa.h
|
||||
MENUS += menuLinr.h
|
||||
MENUS += menuOmsl.h
|
||||
MENUS += menuPriority.h
|
||||
MENUS += menuScan.h
|
||||
MENUS += menuYesNo.h
|
||||
|
||||
RECTYPES += dbCommon.h
|
||||
|
||||
ASCII = dbCommonRecord.ascii menuGlobal.ascii all.ascii
|
||||
|
||||
SRCS.c = \
|
||||
../dbAccess.c ../dbBkpt.c ../dbFastLinkConv.c ../dbLink.c \
|
||||
../dbNotify.c ../dbStaticLib.c ../iocInit.c ../drvTS.c ../dbScan.c \
|
||||
../dbEvent.c ../dbTest.c ../dbls.c ../db_access.c \
|
||||
../db_test.c ../recGbl.c ../callback.c ../taskwd.c \
|
||||
../dbCaLink.c ../dbCaDblink.c ../devLib.c ../initHooks.c
|
||||
../dbAccess.c\
|
||||
../dbBkpt.c\
|
||||
../dbConvert.c\
|
||||
../dbFastLinkConv.c\
|
||||
../dbNotify.c\
|
||||
../iocInit.c\
|
||||
../drvTS.c\
|
||||
../dbScan.c \
|
||||
../dbEvent.c\
|
||||
../dbTest.c\
|
||||
../db_access.c \
|
||||
../db_test.c\
|
||||
../recGbl.c\
|
||||
../callback.c\
|
||||
../taskwd.c \
|
||||
../dbCaLink.c\
|
||||
../dbCaDblink.c\
|
||||
../devLib.c\
|
||||
../initHooks.c
|
||||
|
||||
OBJSdbLib = \
|
||||
dbAccess.o dbBkpt.o dbFastLinkConv.o dbLink.o dbNotify.o \
|
||||
dbStaticLib.o iocInit.o drvTS.o dbScan.o dbEvent.o dbTest.o dbls.o \
|
||||
db_access.o db_test.o recGbl.o callback.o taskwd.o dbCaLink.o \
|
||||
dbCaDblink.o devLib.o
|
||||
LIBOBJS = \
|
||||
dbAccess.o\
|
||||
dbBkpt.o\
|
||||
dbConvert.o\
|
||||
dbFastLinkConv.o\
|
||||
dbNotify.o \
|
||||
iocInit.o\
|
||||
drvTS.o\
|
||||
dbScan.o\
|
||||
dbEvent.o\
|
||||
dbTest.o\
|
||||
db_access.o\
|
||||
db_test.o\
|
||||
recGbl.o\
|
||||
callback.o\
|
||||
taskwd.o\
|
||||
dbCaLink.o \
|
||||
dbCaDblink.o\
|
||||
devLib.o
|
||||
|
||||
PROD = initHooks.o
|
||||
|
||||
PROD = initHooks.o dbLib
|
||||
LIBNAME = dbLib
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
dbLib: $(OBJSdbLib)
|
||||
dbCommon.h: ../dbCommonRecord.ascii dbCommon.ascii
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJSdbLib) $(LDLIBS)
|
||||
|
||||
$(EPICS_BASE)/bin/$(HOST_ARCH)/dbAsciiToRecordtypeH $<
|
||||
|
||||
dbCommon.ascii: ../dbCommon.ascii
|
||||
@test -f $@ || ln -s $< $@
|
||||
|
||||
clean::
|
||||
@$(RM) dbCommon.ascii rec base
|
||||
|
||||
234
src/db/all.ascii
Normal file
234
src/db/all.ascii
Normal file
@@ -0,0 +1,234 @@
|
||||
path "./base/rec"
|
||||
include "menuGlobal.ascii"
|
||||
include "menuConvert.ascii"
|
||||
include "aiRecord.ascii"
|
||||
#include "aaiRecord.ascii"
|
||||
include "aoRecord.ascii"
|
||||
#include "aaoRecord.ascii"
|
||||
include "biRecord.ascii"
|
||||
include "boRecord.ascii"
|
||||
include "calcRecord.ascii"
|
||||
include "compressRecord.ascii"
|
||||
include "dfanoutRecord.ascii"
|
||||
include "egRecord.ascii"
|
||||
include "egeventRecord.ascii"
|
||||
include "erRecord.ascii"
|
||||
include "ereventRecord.ascii"
|
||||
include "eventRecord.ascii"
|
||||
include "fanoutRecord.ascii"
|
||||
include "histogramRecord.ascii"
|
||||
include "longinRecord.ascii"
|
||||
include "longoutRecord.ascii"
|
||||
include "mbbiRecord.ascii"
|
||||
include "mbbiDirectRecord.ascii"
|
||||
include "mbboRecord.ascii"
|
||||
include "mbboDirectRecord.ascii"
|
||||
include "permissiveRecord.ascii"
|
||||
include "pidRecord.ascii"
|
||||
include "pulseCounterRecord.ascii"
|
||||
include "pulseDelayRecord.ascii"
|
||||
include "pulseTrainRecord.ascii"
|
||||
include "scanRecord.ascii"
|
||||
include "selRecord.ascii"
|
||||
include "seqRecord.ascii"
|
||||
include "stateRecord.ascii"
|
||||
include "steppermotorRecord.ascii"
|
||||
include "stringinRecord.ascii"
|
||||
include "stringoutRecord.ascii"
|
||||
include "subRecord.ascii"
|
||||
#include "gsubRecord.ascii"
|
||||
#include "palRecord.ascii"
|
||||
include "subArrayRecord.ascii"
|
||||
include "timerRecord.ascii"
|
||||
include "waitRecord.ascii"
|
||||
include "waveformRecord.ascii"
|
||||
device(ai,CONSTANT,devAiSoft,"Soft Channel")
|
||||
device(ai,CONSTANT,devAiSoftRaw,"Raw Soft Channel")
|
||||
device(ai,VME_IO,devAiXy566Se,"XYCOM-566 SE Scanned")
|
||||
device(ai,VME_IO,devAiXy566Di,"XYCOM-566 Dif Scanned")
|
||||
device(ai,VME_IO,devAiXy566DiL,"XYCOM-566 Dif Latched")
|
||||
device(ai,VME_IO,devAiDvx2502,"DVX-2502")
|
||||
device(ai,CONSTANT,devAiTestAsyn,"Test Asyn")
|
||||
device(ai,CONSTANT,devAiSymb,"vxWorks Variable")
|
||||
device(ai,AB_IO,devAiAb1771Il,"AB-1771IL-Analog In")
|
||||
device(ai,AB_IO,devAiAb1771Ife,"AB-1771IFE")
|
||||
device(ai,AB_IO,devAiAb1771Ixe,"AB-1771IXE-Millivolt In")
|
||||
device(ai,AB_IO,devAiAb1771IfeSe,"AB-1771IFE-SE")
|
||||
device(ai,AB_IO,devAiAb1771IfeMa,"AB-1771IFE-4to20MA")
|
||||
device(ai,AB_IO,devAiAb1771Ife0to5V,"AB-1771IFE-0to5Volt")
|
||||
device(ai,AB_IO,devAiAb1771IrPlatinum,"AB-1771RTD-Platinum")
|
||||
device(ai,AB_IO,devAiAb1771IrCopper,"AB-1771RTD-Copper")
|
||||
#device(ai,CAMAC_IO,devAiCamac,"Camac")
|
||||
device(ai,VME_IO,devAiAt5Vxi,"VXI-AT5-AI")
|
||||
#device(ai,GPIB_IO,devAiK486Gpib,"Keithley-486")
|
||||
#device(ai,VME_IO,devAiKscV215,"KSC-V215")
|
||||
device(ai,VME_IO,devAiSysmon,"SYSMON")
|
||||
#device(aai,CAMAC_IO,devAaiCamac,"Camac")
|
||||
device(ao,CONSTANT,devAoSoft,"Soft Channel")
|
||||
device(ao,CONSTANT,devAoSoftRaw,"Raw Soft Channel")
|
||||
device(ao,VME_IO,devAoVmiVme4100,"VMIVME-4100")
|
||||
device(ao,CONSTANT,devAoTestAsyn,"Test Asyn")
|
||||
device(ao,CONSTANT,devAoSymb,"vxWorks Variable")
|
||||
device(ao,AB_IO,devAoAb1771Ofe,"AB-1771OFE")
|
||||
#device(ao,CAMAC_IO,devAoCamac,"Camac")
|
||||
device(ao,VME_IO,devAoAt5Vxi,"VXI-AT5-AO")
|
||||
device(bi,CONSTANT,devBiSoft,"Soft Channel")
|
||||
device(bi,CONSTANT,devBiSoftRaw,"Raw Soft Channel")
|
||||
device(bi,VME_IO,devBiMpv910,"MPV-910")
|
||||
device(bi,VME_IO,devBiXVme210,"XVME-210")
|
||||
device(bi,CONSTANT,devBiTestAsyn,"Test Asyn")
|
||||
device(bi,AB_IO,devBiAb,"AB-Binary Input")
|
||||
device(bi,AB_IO,devBiAb16,"AB-16 bit BI")
|
||||
device(bi,AB_IO,devBiAb32,"AB-32 bit BI")
|
||||
#device(bi,CAMAC_IO,devBiCamac,"Camac")
|
||||
device(bi,VME_IO,devBiAt5Vxi,"VXI-AT5-BI")
|
||||
#device(bi,VME_IO,devBiXy240,"XYCOM-240")
|
||||
device(bi,VME_IO,devBiHpe1368a,"VXI-HPE1368-VS")
|
||||
#device(bi,VME_IO,devBiAt8Fp,"AT8-FP10S")
|
||||
device(bi,VME_IO,devBiAvme9440,"AVME9440 I")
|
||||
device(bi,VME_IO,devBiSysmon,"SYSMON")
|
||||
device(bi,VME_IO,devBiMpc,"MPC")
|
||||
device(bo,CONSTANT,devBoSoft,"Soft Channel")
|
||||
device(bo,CONSTANT,devBoSoftRaw,"Raw Soft Channel")
|
||||
device(bo,VME_IO,devBoMpv902,"MPV-902")
|
||||
device(bo,VME_IO,devBoXVme220,"XVME-220")
|
||||
device(bo,CONSTANT,devBoTestAsyn,"Test Asyn")
|
||||
device(bo,AB_IO,devBoAb,"AB-Binary Output")
|
||||
device(bo,AB_IO,devBoAb16,"AB-16 bit BO")
|
||||
device(bo,AB_IO,devBoAb32,"AB-32 bit BO")
|
||||
#device(bo,CAMAC_IO,devBoCamac,"Camac")
|
||||
device(bo,VME_IO,devBoAt5Vxi,"VXI-AT5-BO")
|
||||
#device(bo,GPIB_IO,devBoK486Gpib,"Keithley-486")
|
||||
#device(bo,VME_IO,devBoXy240,"XYCOM-240")
|
||||
device(bo,VME_IO,devBoHpe1368a,"VXI-HPE1368-VS")
|
||||
#device(bo,VME_IO,devBoAt8Fp,"AT8-FP10S")
|
||||
device(bo,VME_IO,devBoAvme9440,"AVME9440 O")
|
||||
device(bo,VME_IO,devBoSysmon,"SYSMON")
|
||||
device(bo,VME_IO,devBoMpc,"MPC")
|
||||
device(event,CONSTANT,devEventSoft,"Soft Channel")
|
||||
device(event,VME_IO,devEventMz8310,"Mizar-8310")
|
||||
device(event,CONSTANT,devEventTestIoEvent,"Test IoEvent")
|
||||
device(event,VME_IO,devErEpicsEvent,"APS event receiver")
|
||||
device(histogram,CONSTANT,devHistogramSoft,"Soft Channel")
|
||||
device(histogram,CONSTANT,devHistogramTestAsyn,"Test Asyn")
|
||||
device(longin,CONSTANT,devLiSoft,"Soft Channel")
|
||||
device(longin,CONSTANT,devLiSymb,"vxWorks Variable")
|
||||
#device(longin,CAMAC_IO,devLiCamac,"Camac")
|
||||
device(longout,CONSTANT,devLoSoft,"Soft Channel")
|
||||
device(longout,CONSTANT,devLoSymb,"vxWorks Variable")
|
||||
#device(longout,CAMAC_IO,devLoCamac,"Camac")
|
||||
device(mbbi,CONSTANT,devMbbiSoft,"Soft Channel")
|
||||
device(mbbi,CONSTANT,devMbbiSoftRaw,"Raw Soft Channel")
|
||||
device(mbbi,VME_IO,devMbbiMpv910,"MPV-910")
|
||||
device(mbbi,VME_IO,devMbbiXVme210,"XVME-210")
|
||||
device(mbbi,CONSTANT,devMbbiTestAsyn,"Test Asyn")
|
||||
device(mbbi,AB_IO,devMbbiAb,"AB-Binary Input")
|
||||
device(mbbi,AB_IO,devMbbiAb16,"AB-16 bit BI")
|
||||
device(mbbi,AB_IO,devMbbiAb32,"AB-32 bit BI")
|
||||
device(mbbi,AB_IO,devMbbiAbAdapterStat,"AB-Adapter Status")
|
||||
device(mbbi,AB_IO,devMbbiAbCardStat,"AB-Card Status")
|
||||
#device(mbbi,CAMAC_IO,devMbbiCamac,"Camac")
|
||||
device(mbbi,VME_IO,devMbbiAt5Vxi,"VXI-AT5-BI")
|
||||
#device(mbbi,VME_IO,devMbbiXy240,"XYCOM-240")
|
||||
device(mbbi,VME_IO,devMbbiHpe1368a,"VXI-HPE1368-VS")
|
||||
#device(mbbi,VME_IO,devMbbiAt8Fp,"AT8-FP10S")
|
||||
device(mbbi,VME_IO,devMbbiAvme9440,"AVME9440 I")
|
||||
device(mbbi,VME_IO,devMbbiSysmon,"SYSMON")
|
||||
device(mbbiDirect,CONSTANT,devMbbiDirectSoft,"Soft Channel")
|
||||
device(mbbiDirect,CONSTANT,devMbbiDirectSoftRaw,"Raw Soft Channel")
|
||||
device(mbbiDirect,VME_IO,devMbbiDirectMpv910,"MPV-910")
|
||||
device(mbbiDirect,VME_IO,devMbbiDirectXVme210,"XVME-210")
|
||||
device(mbbiDirect,AB_IO,devMbbiDirectAb,"AB-Binary Input")
|
||||
device(mbbiDirect,AB_IO,devMbbiDirectAb16,"AB-16 bit BI")
|
||||
device(mbbiDirect,AB_IO,devMbbiDirectAb32,"AB-32 bit BI")
|
||||
#device(mbbiDirect,CAMAC_IO,devMbbiDirectCamac,"Camac")
|
||||
device(mbbiDirect,VME_IO,devMbbiDirectAt5Vxi,"VXI-AT5-BI")
|
||||
device(mbbo,CONSTANT,devMbboSoft,"Soft Channel")
|
||||
device(mbbo,CONSTANT,devMbboSoftRaw,"Raw Soft Channel")
|
||||
device(mbbo,VME_IO,devMbboMpv902,"MPV-902")
|
||||
device(mbbo,VME_IO,devMbboXVme220,"XVME-220")
|
||||
device(mbbo,CONSTANT,devMbboTestAsyn,"Test Asyn")
|
||||
device(mbbo,AB_IO,devMbboAb,"AB-Binary Output")
|
||||
device(mbbo,AB_IO,devMbboAb16,"AB-16 bit BO")
|
||||
device(mbbo,AB_IO,devMbboAb32,"AB-32 bit BO")
|
||||
device(mbbo,VME_IO,devMbboAt5Vxi,"VXI-AT5-BO")
|
||||
#device(mbbo,GPIB_IO,devMbboK486Gpib,"Keithley-486")
|
||||
#device(mbbo,VME_IO,devMbboXy240,"XYCOM-240")
|
||||
device(mbbo,VME_IO,devMbboHpe1368a,"VXI-HPE1368-VS")
|
||||
#device(mbbo,VME_IO,devMbboAt8Fp,"AT8-FP10S")
|
||||
device(mbbo,VME_IO,devMbboAvme9440,"AVME9440 O")
|
||||
device(mbbo,VME_IO,devMbboSysmon,"SYSMON")
|
||||
device(mbboDirect,CONSTANT,devMbboDirectSoft,"Soft Channel")
|
||||
device(mbboDirect,CONSTANT,devMbboDirectSoftRaw,"Raw Soft Channel")
|
||||
device(mbboDirect,VME_IO,devMbboDirectMpv902,"MPV-902")
|
||||
device(mbboDirect,VME_IO,devMbboDirectXVme220,"XVME-220")
|
||||
device(mbboDirect,AB_IO,devMbboDirectAb,"AB-Binary Output")
|
||||
device(mbboDirect,AB_IO,devMbboDirectAb16,"AB-16 bit BO")
|
||||
device(mbboDirect,AB_IO,devMbboDirectAb32,"AB-32 bit BO")
|
||||
#device(mbboDirect,CAMAC_IO,devMbboDirectCamac,"Camac")
|
||||
device(mbboDirect,VME_IO,devMbboDirectAt5Vxi,"VXI-AT5-BO")
|
||||
device(pulseCounter,VME_IO,devPcMz8310,"Mizar-8310")
|
||||
device(pulseDelay,VME_IO,devPdMz8310,"Mizar-8310")
|
||||
device(pulseDelay,VXI_IO,devPdVxiTDM,"VXI Time Delay Module")
|
||||
device(pulseTrain,CONSTANT,devPtSoft,"Soft Channel")
|
||||
device(pulseTrain,VME_IO,devPtMz8310,"Mizar-8310")
|
||||
device(steppermotor,VME_IO,devSmCompumotor1830,"Compumotor 1830")
|
||||
device(steppermotor,VME_IO,devSmOms6Axis,"OMS 6-Axis")
|
||||
device(stringin,CONSTANT,devSiSoft,"Soft Channel")
|
||||
device(stringin,CONSTANT,devSiTestAsyn,"Test Asyn")
|
||||
device(stringin,CONSTANT,devSiSymb,"vxWorks Variable")
|
||||
device(stringout,CONSTANT,devSoSoft,"Soft Channel")
|
||||
device(stringout,CONSTANT,devSoTestAsyn,"Test Asyn")
|
||||
device(stringout,CONSTANT,devSoSymb,"vxWorks Variable")
|
||||
device(subArray,CONSTANT,devSASoft,"Soft Channel")
|
||||
device(timer,VME_IO,devTmMizar8310,"Mizar-8310")
|
||||
device(timer,VME_IO,devTmDg535,"DG 535")
|
||||
device(timer,VME_IO,devTmAt5Vxi,"VXI-AT5-TIME")
|
||||
device(waveform,CONSTANT,devWfSoft,"Soft Channel")
|
||||
device(waveform,VME_IO,devWfXy566Sc,"XYCOM-566 Single Channel")
|
||||
device(waveform,VME_IO,devWfComet,"Comet Digitizer")
|
||||
device(waveform,VME_IO,devWfJoergerVtr1,"Joerger Digitizer")
|
||||
device(waveform,CONSTANT,devWfTestAsyn,"Test Asyn")
|
||||
device(waveform,VME_IO,devWfDvx2502,"DVX-2502")
|
||||
device(waveform,VME_IO,devWfPentek4261,"Pentek 4261")
|
||||
#device(waveform,CAMAC_IO,devWfCamac,"Camac")
|
||||
#device(waveform,VME_IO,devWfJoergerVtr1,"Joerger-VTR1")
|
||||
#device(waveform,VME_IO,devWfComet,"Omnibyte-COMET")
|
||||
device(eg,VME_IO,devEg,"APS event generator G")
|
||||
device(egevent,VME_IO,devEgEvent,"APS event generator E")
|
||||
device(er,VME_IO,devEr,"APS event receiver")
|
||||
device(erevent,VME_IO,devErevent,"APS event receiver")
|
||||
device(wait,CONSTANT,devWaitIoEvent,"Soft Channel")
|
||||
#device(ai,INST_IO,devAiCan,"CANbus")
|
||||
#device(ao,INST_IO,devAoCan,"CANbus")
|
||||
#device(bi,INST_IO,devBiCan,"CANbus")
|
||||
#device(bo,INST_IO,devBoCan,"CANbus")
|
||||
#device(mbbi,INST_IO,devMbbiCan,"CANbus")
|
||||
#device(mbbo,INST_IO,devMbboCan,"CANbus")
|
||||
#device(mbbiDirect,INST_IO,devMbbiDirectCan,"CANbus")
|
||||
#device(mbboDirect,INST_IO,devMbboDirectCan,"CANbus")
|
||||
driver(drvXy010)
|
||||
driver(drvVxi)
|
||||
driver(drvGpib)
|
||||
driver(drvBitBus)
|
||||
driver(drvBb910)
|
||||
driver(drvXy210)
|
||||
driver(drvBb902)
|
||||
driver(drvXy220)
|
||||
driver(drvXy566)
|
||||
driver(drvDvx)
|
||||
driver(drvVmi4100)
|
||||
driver(drvAb)
|
||||
driver(drvAt5Vxi)
|
||||
driver(drvCompuSm)
|
||||
driver(drvOms)
|
||||
driver(drvMz8310)
|
||||
driver(drvHpe1368a)
|
||||
#driver(drvXy240)
|
||||
#driver(drvKscV215)
|
||||
#driver(drvComet)
|
||||
#driver(drvJgvtr1)
|
||||
#driver(drvFp)
|
||||
#driver(drvFpm)
|
||||
#driver(drvIpac)
|
||||
#driver(drvTip810)
|
||||
@@ -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)>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);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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>
|
||||
|
||||
|
||||
@@ -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.ascii
Normal file
246
src/db/dbCommon.ascii
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.ascii
Normal file
3
src/db/dbCommonRecord.ascii
Normal file
@@ -0,0 +1,3 @@
|
||||
recordtype(dbCommon) {
|
||||
include "dbCommon.ascii"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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 */
|
||||
|
||||
|
||||
@@ -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} };
|
||||
|
||||
|
||||
@@ -35,7 +35,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <taskLib.h>
|
||||
#include <semLib.h>
|
||||
#include <sysLib.h>
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <fast_lock.h>
|
||||
@@ -45,185 +48,326 @@
|
||||
#include <dbScan.h>
|
||||
#include <dbCommon.h>
|
||||
#include <errMdef.h>
|
||||
#include <ellLib.h>
|
||||
#include <recGbl.h>
|
||||
|
||||
/*NODE structure attached to ppnn field of each record in list*/
|
||||
typedef struct {
|
||||
ELLNODE node;
|
||||
struct dbCommon *precord;
|
||||
} PNWAITNODE;
|
||||
|
||||
/*Local routines*/
|
||||
static void restartAdd(PUTNOTIFY *ppnto, PUTNOTIFY *ppnfrom);
|
||||
static void waitAdd(struct dbCommon *precord,PUTNOTIFY *ppn);
|
||||
static long putNotify(PUTNOTIFY *ppn);
|
||||
static void notifyCallback(CALLBACK *pcallback);
|
||||
static void notifyCancel(PUTNOTIFY *ppn);
|
||||
static void issueCallback(PUTNOTIFY *ppn);
|
||||
|
||||
/*callbackState values */
|
||||
typedef enum {
|
||||
callbackNotActive,callbackActive,callbackCanceled}callbackState;
|
||||
|
||||
static void notifyCallback(CALLBACK *pcallback)
|
||||
{
|
||||
PUTNOTIFY *ppn=NULL;
|
||||
long status;
|
||||
/* This module provides code to handle put notify. If a put causes a record to
|
||||
* be processed, then a user supplied callback is called when that record
|
||||
* and all records processed because of that record complete processing.
|
||||
* For asynchronous records completion means completion of the asyn phase.
|
||||
*
|
||||
* User code calls dbPutNotify and dbNotifyCancel.
|
||||
*
|
||||
* The other global routines (dbNotifyAdd and dbNotifyCompletion) are called by:
|
||||
*
|
||||
* dbAccess.c
|
||||
* dbScanPassive and dbScanLink
|
||||
* call dbNotifyAdd just before calling dbProcess
|
||||
* dbProcess
|
||||
* Calls dbNotifyCompletion if record is disabled.
|
||||
* recGbl
|
||||
* recGblFwdLink calls dbNotifyCompletion
|
||||
*/
|
||||
|
||||
callbackGetUser(ppn,pcallback);
|
||||
if(ppn->cmd==notifyCmdRepeat) {
|
||||
status = dbPutNotify(ppn);
|
||||
} else if(ppn->cmd==notifyCmdCallUser) {
|
||||
ppn->cmd = notifyUserCalled;
|
||||
(ppn->userCallback)(ppn);
|
||||
} else {/*illegal request*/
|
||||
recGblRecordError(-1,ppn->paddr->precord,
|
||||
"dbNotifyCompletion: illegal callback request");
|
||||
}
|
||||
}
|
||||
|
||||
static void notifyCancel(PUTNOTIFY *ppn)
|
||||
{
|
||||
struct dbCommon *precord = ppn->list;
|
||||
|
||||
while(precord) {
|
||||
void *pnext;
|
||||
|
||||
if(precord->rpro) {
|
||||
precord->rpro = FALSE;
|
||||
scanOnce(precord);
|
||||
}
|
||||
precord->ppn = NULL;
|
||||
pnext = precord->ppnn;
|
||||
precord->ppnn = NULL;
|
||||
precord = pnext;
|
||||
}
|
||||
ppn->list = NULL;
|
||||
}
|
||||
|
||||
void dbNotifyCancel(PUTNOTIFY *ppn)
|
||||
{
|
||||
struct dbCommon *precord = ppn->list;
|
||||
|
||||
if(!precord) return;
|
||||
dbScanLock(precord);
|
||||
notifyCancel(ppn);
|
||||
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
|
||||
/*Bad lets try one time to wait*/
|
||||
dbScanUnlock(precord);
|
||||
taskDelay(10);
|
||||
dbScanLock(precord);
|
||||
}
|
||||
if(ppn->cmd!=notifyCmdNull && ppn->cmd!=notifyUserCalled) {
|
||||
epicsPrintf("dbNotifyCancel called while callback requested"
|
||||
" but not called\n");
|
||||
}
|
||||
dbScanUnlock(precord);
|
||||
}
|
||||
|
||||
static void issueCallback(PUTNOTIFY *ppn, notifyCmd cmd)
|
||||
{
|
||||
if(ppn->cmd!=notifyCmdNull) return;
|
||||
ppn->cmd = cmd;
|
||||
notifyCancel(ppn);
|
||||
callbackRequest(&ppn->callback);
|
||||
}
|
||||
/* Two fields in dbCommon are used for put notify.
|
||||
* ppn
|
||||
* If a record is part of a put notify group,
|
||||
* This field is tha address of the associated PUTNOTIFY.
|
||||
* As soon as a record completes processing the field is set NULL
|
||||
* ppnn
|
||||
* Address of an PNWAITNODE for keeping list of records in a
|
||||
* put notify group. Once an PNWAITNODE is allocated for a record,
|
||||
* it is never freed under the assumption that once a record
|
||||
* becomes part of a put notify group it is likely to become
|
||||
* one again in the future.
|
||||
*/
|
||||
|
||||
static void restartAdd(PUTNOTIFY *ppnto, PUTNOTIFY *ppnfrom)
|
||||
{
|
||||
ppnfrom->restartNode.ppn = ppnfrom;
|
||||
ppnfrom->restartNode.ppnrestartList = ppnto;
|
||||
ppnfrom->restart = TRUE;
|
||||
ellAdd(&ppnto->restartList,&ppnfrom->restartNode.node);
|
||||
}
|
||||
|
||||
static void waitAdd(struct dbCommon *precord,PUTNOTIFY *ppn)
|
||||
{
|
||||
PNWAITNODE *ppnnode;
|
||||
|
||||
if(!precord->ppnn) precord->ppnn = dbCalloc(1,sizeof(PNWAITNODE));
|
||||
ppnnode = (PNWAITNODE *)precord->ppnn;
|
||||
ppnnode->precord = precord;
|
||||
precord->ppn = ppn;
|
||||
ellAdd(&ppn->waitList,&ppnnode->node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
long dbPutNotify(PUTNOTIFY *ppn)
|
||||
{
|
||||
long status;
|
||||
struct dbCommon *precord = ppn->paddr->precord;
|
||||
|
||||
dbScanLock(precord);
|
||||
ellInit(&ppn->restartList);
|
||||
memset(&ppn->restartNode,'\0',sizeof(PNRESTARTNODE));
|
||||
status = putNotify(ppn);
|
||||
dbScanUnlock(precord);
|
||||
return(status);
|
||||
}
|
||||
|
||||
static long putNotify(PUTNOTIFY *ppn)
|
||||
{
|
||||
struct dbAddr *paddr = ppn->paddr;
|
||||
short dbrType = ppn->dbrType;
|
||||
void *pbuffer = ppn->pbuffer;
|
||||
long nRequest = ppn->nRequest;
|
||||
long status=0;
|
||||
struct fldDes *pfldDes=(struct fldDes *)(paddr->pfldDes);
|
||||
short dbrType = ppn->dbrType;
|
||||
void *pbuffer = ppn->pbuffer;
|
||||
long nRequest = ppn->nRequest;
|
||||
long status=0;
|
||||
dbFldDes *pfldDes=(dbFldDes *)(paddr->pfldDes);
|
||||
struct dbCommon *precord = (struct dbCommon *)(paddr->precord);
|
||||
|
||||
if(precord->ppn == ppn) {
|
||||
return(S_db_Blocked);
|
||||
}
|
||||
/*Initialize everything in PUTNOTIFY except restart list and node*/
|
||||
callbackSetCallback(notifyCallback,&ppn->callback);
|
||||
callbackSetUser(ppn,&ppn->callback);
|
||||
callbackSetPriority(priorityLow,&ppn->callback);
|
||||
ppn->status = 0;
|
||||
ppn->restart = FALSE;
|
||||
ppn->callbackState = callbackNotActive;
|
||||
ellInit(&ppn->waitList);
|
||||
/*check for putField disabled*/
|
||||
if(precord->disp) {
|
||||
if((void *)(&precord->disp) != paddr->pfield) {
|
||||
ppn->status = S_db_putDisabled;
|
||||
issueCallback(ppn,notifyCmdCallUser);
|
||||
return(S_db_putDisabled);
|
||||
issueCallback(ppn);
|
||||
goto ret_pending;
|
||||
}
|
||||
}
|
||||
ppn->status = 0;
|
||||
ppn->cmd = notifyCmdNull;
|
||||
ppn->nwaiting = 1;
|
||||
ppn->rescan = FALSE;
|
||||
dbScanLock(precord);
|
||||
if(precord->ppn) {/*Another put notify is in progress*/
|
||||
restartAdd(precord->ppn,ppn);
|
||||
goto ret_pending;
|
||||
}
|
||||
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
|
||||
precord->ppn = ppn;
|
||||
waitAdd(precord,ppn);
|
||||
restartAdd(precord->ppn,ppn);
|
||||
goto ret_pending;
|
||||
}
|
||||
status=dbPut(paddr,dbrType,pbuffer,nRequest);
|
||||
ppn->status = status;
|
||||
if(status==0){
|
||||
if((paddr->pfield==(void *)&precord->proc)
|
||||
||(pfldDes->process_passive && precord->scan==0)) {
|
||||
if(precord->ppn) {
|
||||
/*record already has attached ppn. Blocked*/
|
||||
|
||||
ppn->status = status = S_db_Blocked;
|
||||
dbScanUnlock(precord);
|
||||
return(status);
|
||||
}
|
||||
precord->ppn = ppn;
|
||||
precord->ppnn = NULL;
|
||||
ppn->list = precord;
|
||||
if(precord->pact) {/*blocked wait for dbNotifyCompletion*/
|
||||
ppn->rescan = TRUE;
|
||||
dbScanUnlock(precord);
|
||||
return(S_db_Pending);
|
||||
}
|
||||
status=dbProcess(precord);
|
||||
if(status!=0) {
|
||||
ppn->status = status;
|
||||
issueCallback(ppn,notifyCmdCallUser);
|
||||
}
|
||||
} else { /*Make callback immediately*/
|
||||
issueCallback(ppn,notifyCmdCallUser);
|
||||
}
|
||||
if(status) {
|
||||
ppn->status = status;
|
||||
issueCallback(ppn);
|
||||
goto ret_pending;
|
||||
}
|
||||
/*check for no processing required*/
|
||||
if(!(paddr->pfield==(void *)&precord->proc)
|
||||
&& (!pfldDes->process_passive || precord->scan!=0)) {
|
||||
issueCallback(ppn);
|
||||
goto ret_pending;
|
||||
}
|
||||
dbScanUnlock(precord);
|
||||
/*Add record to waitlist*/
|
||||
waitAdd(precord,ppn);
|
||||
status=dbProcess(precord);
|
||||
if(status!=0) {
|
||||
ppn->status = status;
|
||||
issueCallback(ppn);
|
||||
}
|
||||
ret_pending:
|
||||
return(S_db_Pending);
|
||||
}
|
||||
|
||||
void dbNotifyCompletion(PUTNOTIFY *ppn)
|
||||
static void notifyCallback(CALLBACK *pcallback)
|
||||
{
|
||||
PUTNOTIFY *ppn=NULL;
|
||||
struct dbCommon *precord;
|
||||
|
||||
if(ppn->status!=0) {
|
||||
issueCallback(ppn,notifyCmdCallUser);
|
||||
callbackGetUser(ppn,pcallback);
|
||||
precord = ppn->paddr->precord;
|
||||
dbScanLock(precord);
|
||||
if(ppn->callbackState==callbackCanceled) {
|
||||
dbScanUnlock(precord);
|
||||
ppn->restart = FALSE;
|
||||
ppn->callbackState = callbackNotActive;
|
||||
semGive((SEM_ID)ppn->waitForCallback);
|
||||
return;
|
||||
}
|
||||
/*decrement number of records being waited on*/
|
||||
if(ppn->nwaiting<=0) {
|
||||
recGblRecordError(-1,ppn->paddr->precord,"dbNotifyCompletion: nwaiting<-0 LOGIC");
|
||||
return;
|
||||
}
|
||||
if(--ppn->nwaiting == 0) {/*original request completed*/
|
||||
if(ppn->rescan) {
|
||||
issueCallback(ppn,notifyCmdRepeat);
|
||||
if(ppn->callbackState==callbackActive) {
|
||||
if(ppn->restart) {
|
||||
putNotify(ppn);
|
||||
dbScanUnlock(precord);
|
||||
} else {
|
||||
issueCallback(ppn,notifyCmdCallUser);
|
||||
dbScanUnlock(precord);
|
||||
(ppn->userCallback)(ppn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*Remove all nonactive records from put notify list*/
|
||||
void cleanPpList(PUTNOTIFY *ppn)
|
||||
{
|
||||
struct dbCommon *precord = ppn->list;
|
||||
struct dbCommon *pnext;
|
||||
struct dbCommon *pprev=NULL;
|
||||
|
||||
while(precord) {
|
||||
pnext = precord->ppnn;
|
||||
if(!precord->pact) {
|
||||
if(!pprev) ppn->list = pnext; else pprev->ppnn = pnext;
|
||||
precord->ppn = NULL;
|
||||
precord->ppnn = NULL;
|
||||
} else {
|
||||
pprev = precord;
|
||||
static void issueCallback(PUTNOTIFY *ppn)
|
||||
{
|
||||
notifyCancel(ppn);
|
||||
ppn->callbackState = callbackActive;
|
||||
callbackRequest(&ppn->callback);
|
||||
}
|
||||
|
||||
void dbNotifyCancel(PUTNOTIFY *ppn)
|
||||
{
|
||||
struct dbCommon *precord = ppn->paddr->precord;;
|
||||
|
||||
dbScanLock(precord);
|
||||
notifyCancel(ppn);
|
||||
if(ppn->callbackState == callbackActive) {
|
||||
ppn->waitForCallback = (void *)semBCreate(SEM_Q_FIFO,SEM_FULL);
|
||||
ppn->callbackState = callbackCanceled;
|
||||
dbScanUnlock(precord);
|
||||
if(semTake((SEM_ID)ppn->waitForCallback,sysClkRateGet()*10)!=OK) {
|
||||
errMessage(0,"dbNotifyCancel had semTake timeout");
|
||||
ppn->callbackState = callbackNotActive;
|
||||
}
|
||||
precord = pnext;
|
||||
semDelete((SEM_ID)ppn->waitForCallback);
|
||||
} else {
|
||||
dbScanUnlock(precord);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void notifyCancel(PUTNOTIFY *ppn)
|
||||
{
|
||||
PNWAITNODE *ppnnode;
|
||||
struct dbCommon *precord;
|
||||
PNRESTARTNODE *pfirst;
|
||||
|
||||
/*Remove everything on waitList*/
|
||||
while(ppnnode = (PNWAITNODE *)ellLast(&ppn->waitList)) {
|
||||
precord = ppnnode->precord;
|
||||
precord->ppn = NULL;
|
||||
ellDelete(&ppn->waitList,&ppnnode->node);
|
||||
}
|
||||
/*If on restartList remove it*/
|
||||
if(ppn->restartNode.ppnrestartList)
|
||||
ellDelete(&ppn->restartNode.ppnrestartList->restartList,
|
||||
&ppn->restartNode.node);
|
||||
/*If this ppn has a restartList move it */
|
||||
if(pfirst = (PNRESTARTNODE *)ellFirst(&ppn->restartList)) {
|
||||
PNRESTARTNODE *pnext;
|
||||
PUTNOTIFY *pfirstppn;
|
||||
|
||||
pfirstppn = pfirst->ppn;
|
||||
ellConcat(&pfirstppn->restartList,&ppn->restartList);
|
||||
pnext = (PNRESTARTNODE *)ellFirst(&pfirstppn->restartList);
|
||||
while(pnext) {
|
||||
pnext->ppnrestartList = pfirstppn;
|
||||
pnext = (PNRESTARTNODE *)ellNext(&pnext->node);
|
||||
}
|
||||
pfirstppn->restart = TRUE;
|
||||
pfirstppn->callbackState = callbackActive;
|
||||
callbackRequest(&pfirstppn->callback);
|
||||
}
|
||||
memset(&ppn->restartNode,'\0',sizeof(PNRESTARTNODE));
|
||||
}
|
||||
|
||||
void dbNotifyCompletion(struct dbCommon *precord)
|
||||
{
|
||||
PUTNOTIFY *ppn = (PUTNOTIFY *)precord->ppn;
|
||||
PNWAITNODE *ppnnode = (PNWAITNODE *)precord->ppnn;;
|
||||
|
||||
ellDelete(&ppn->waitList,&ppnnode->node);
|
||||
precord->ppn = NULL;
|
||||
if((ppn->status!=0) || (ellCount(&ppn->waitList)==0))
|
||||
issueCallback(ppn);
|
||||
}
|
||||
|
||||
void dbNotifyAdd(struct dbCommon *pfrom, struct dbCommon *pto)
|
||||
{
|
||||
PUTNOTIFY *ppn = pfrom->ppn;
|
||||
PUTNOTIFY *pfromppn = (PUTNOTIFY *)pfrom->ppn;
|
||||
PUTNOTIFY *ppn=NULL;
|
||||
|
||||
if(pto->ppn) cleanPpList(pto->ppn); /* clean list before giving up*/
|
||||
if(pto->ppn == pfrom->ppn) return; /*Aready in same set*/
|
||||
if (pto->ppn) { /*already being used. Abandon request*/
|
||||
ppn->status = S_db_Blocked;
|
||||
dbNotifyCompletion(ppn);
|
||||
notifyCancel(pfrom->ppn);
|
||||
restartAdd(pto->ppn,pfromppn);
|
||||
return;
|
||||
} else {
|
||||
ppn->nwaiting++;
|
||||
pto->ppn = pfrom->ppn;
|
||||
pto->ppnn = ppn->list;
|
||||
ppn->list = pto;
|
||||
/*If already active must redo*/
|
||||
if(pto->pact) ppn->rescan = TRUE;
|
||||
/*If already active must redo*/
|
||||
if(pto->pact) {
|
||||
ppn = pfrom->ppn;
|
||||
notifyCancel(pfrom->ppn);
|
||||
waitAdd(pto,ppn);
|
||||
restartAdd(pto->ppn,ppn);
|
||||
} else {
|
||||
waitAdd(pto,pfrom->ppn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void dbtpnCallback(PUTNOTIFY *ppn)
|
||||
{
|
||||
DBADDR *pdbaddr = ppn->paddr;
|
||||
long status = ppn->status;
|
||||
|
||||
if(status==S_db_Blocked)
|
||||
printf("dbtpnCallback: blocked record=%s\n",ppn->paddr->precord->name);
|
||||
else if(status==0)
|
||||
printf("dbtpnCallback: success record=%s\n",ppn->paddr->precord->name);
|
||||
else
|
||||
recGblRecordError(status,pdbaddr->precord,"dbtpnCallback");
|
||||
free((void *)pdbaddr);
|
||||
free(ppn);
|
||||
}
|
||||
|
||||
long dbtpn(char *pname,char *pvalue)
|
||||
{
|
||||
long status;
|
||||
DBADDR *pdbaddr=NULL;
|
||||
PUTNOTIFY *ppn=NULL;
|
||||
char *psavevalue;
|
||||
int len;
|
||||
|
||||
len = strlen(pvalue);
|
||||
/*allocate space for value immediately following DBADDR*/
|
||||
pdbaddr = dbCalloc(1,sizeof(DBADDR) + len+1);
|
||||
psavevalue = (char *)(pdbaddr + 1);
|
||||
strcpy(psavevalue,pvalue);
|
||||
status = dbNameToAddr(pname,pdbaddr);
|
||||
if(status) {
|
||||
errMessage(status, "dbtpn: dbNameToAddr");
|
||||
free((void *)pdbaddr);
|
||||
return(-1);
|
||||
}
|
||||
ppn = dbCalloc(1,sizeof(PUTNOTIFY));
|
||||
ppn->paddr = pdbaddr;
|
||||
ppn->pbuffer = psavevalue;
|
||||
ppn->nRequest = 1;
|
||||
ppn->dbrType = DBR_STRING;
|
||||
ppn->userCallback = dbtpnCallback;
|
||||
status = dbPutNotify(ppn);
|
||||
if(status==S_db_Pending) {
|
||||
printf("dbtpn: Pending nwaiting=%d\n",ellCount(&ppn->waitList));
|
||||
return(0);
|
||||
}
|
||||
if(status==S_db_Blocked) {
|
||||
printf("dbtpn: blocked record=%s\n",pname);
|
||||
} else if(status) {
|
||||
errMessage(status, "dbtpn");
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
198
src/db/dbScan.c
198
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,22 +51,25 @@
|
||||
#include <ellLib.h>
|
||||
#include <vxLib.h>
|
||||
#include <tickLib.h>
|
||||
#include <sysLib.h>
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <epicsPrint.h>
|
||||
#include <dbBase.h>
|
||||
#include <dbStaticLib.h>
|
||||
#include <dbAccess.h>
|
||||
#include <dbScan.h>
|
||||
#include <taskwd.h>
|
||||
#include <callback.h>
|
||||
#include <dbBase.h>
|
||||
#include <dbCommon.h>
|
||||
#include <dbRecords.h>
|
||||
#include <devSup.h>
|
||||
#include <recGbl.h>
|
||||
#include <task_params.h>
|
||||
#include <fast_lock.h>
|
||||
#include <dbStaticLib.h>
|
||||
|
||||
extern struct dbBase *pdbBase;
|
||||
extern volatile int interruptAccept;
|
||||
extern struct dbBase *pdbbase;
|
||||
|
||||
/* SCAN ONCE */
|
||||
#define ONCE_QUEUE_SIZE 256
|
||||
@@ -146,7 +149,7 @@ long scanInit()
|
||||
void post_event(int event)
|
||||
{
|
||||
unsigned char evnt;
|
||||
int status;
|
||||
static int newOverflow=TRUE;
|
||||
|
||||
if (!interruptAccept) return; /* not awake yet */
|
||||
if(event<0 || event>=MAX_EVENTS) {
|
||||
@@ -156,14 +159,14 @@ void post_event(int event)
|
||||
evnt = (unsigned)event;
|
||||
/*multiple writers can exist. Thus if evnt is ever changed to use*/
|
||||
/*something bigger than a character interrupts will have to be blocked*/
|
||||
if(rngBufPut(eventQ,(void *)&evnt,sizeof(unsigned char))!=sizeof(unsigned char))
|
||||
errMessage(0,"rngBufPut overflow in post_event");
|
||||
if((status=semGive(eventSem))!=OK){
|
||||
/*semGive randomly returns garbage value*/
|
||||
/*
|
||||
errMessage(0,"semGive returned error in post_event");
|
||||
*/
|
||||
}
|
||||
if(rngBufPut(eventQ,(void *)&evnt,sizeof(unsigned char))
|
||||
!=sizeof(unsigned char)) {
|
||||
if(newOverflow) errMessage(0,"rngBufPut overflow in post_event");
|
||||
newOverflow = FALSE;
|
||||
} else {
|
||||
newOverflow = TRUE;
|
||||
}
|
||||
semGive(eventSem);
|
||||
}
|
||||
|
||||
|
||||
@@ -176,12 +179,14 @@ void scanAdd(struct dbCommon *precord)
|
||||
scan = precord->scan;
|
||||
if(scan==SCAN_PASSIVE) return;
|
||||
if(scan<0 || scan>= nPeriodic+SCAN_1ST_PERIODIC) {
|
||||
recGblRecordError(-1,(void *)precord,"scanAdd detected illegal SCAN value");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanAdd detected illegal SCAN value");
|
||||
}else if(scan==SCAN_EVENT) {
|
||||
unsigned char evnt;
|
||||
|
||||
if(precord->evnt<0 || precord->evnt>=MAX_EVENTS) {
|
||||
recGblRecordError(S_db_badField,(void *)precord,"scanAdd detected illegal EVNT value");
|
||||
recGblRecordError(S_db_badField,(void *)precord,
|
||||
"scanAdd detected illegal EVNT value");
|
||||
precord->scan = SCAN_PASSIVE;
|
||||
return;
|
||||
}
|
||||
@@ -200,13 +205,15 @@ void scanAdd(struct dbCommon *precord)
|
||||
DEVSUPFUN get_ioint_info;
|
||||
|
||||
if(precord->dset==NULL){
|
||||
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid (no DSET) ");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanAdd: I/O Intr not valid (no DSET) ");
|
||||
precord->scan = SCAN_PASSIVE;
|
||||
return;
|
||||
}
|
||||
get_ioint_info=precord->dset->get_ioint_info;
|
||||
if(get_ioint_info==NULL) {
|
||||
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid (no get_ioint_info)");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanAdd: I/O Intr not valid (no get_ioint_info)");
|
||||
precord->scan = SCAN_PASSIVE;
|
||||
return;
|
||||
}
|
||||
@@ -215,13 +222,15 @@ void scanAdd(struct dbCommon *precord)
|
||||
return;
|
||||
}
|
||||
if(piosl==NULL) {
|
||||
recGblRecordError(-1,(void *)precord,"scanAdd: I/O Intr not valid");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanAdd: I/O Intr not valid");
|
||||
precord->scan = SCAN_PASSIVE;
|
||||
return;
|
||||
}
|
||||
priority = precord->prio;
|
||||
if(priority<0 || priority>=NUM_CALLBACK_PRIORITIES) {
|
||||
recGblRecordError(-1,(void *)precord,"scanAdd: illegal prio field");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanAdd: illegal prio field");
|
||||
precord->scan = SCAN_PASSIVE;
|
||||
return;
|
||||
}
|
||||
@@ -246,18 +255,21 @@ void scanDelete(struct dbCommon *precord)
|
||||
scan = precord->scan;
|
||||
if(scan==SCAN_PASSIVE) return;
|
||||
if(scan<0 || scan>= nPeriodic+SCAN_1ST_PERIODIC) {
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete detected illegal SCAN value");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete detected illegal SCAN value");
|
||||
}else if(scan==SCAN_EVENT) {
|
||||
unsigned char evnt;
|
||||
|
||||
if(precord->evnt<0 || precord->evnt>=MAX_EVENTS) {
|
||||
recGblRecordError(S_db_badField,(void *)precord,"scanDelete detected illegal EVNT value");
|
||||
recGblRecordError(S_db_badField,(void *)precord,
|
||||
"scanDelete detected illegal EVNT value");
|
||||
return;
|
||||
}
|
||||
evnt = (signed)precord->evnt;
|
||||
psl = papEvent[evnt];
|
||||
if(psl==NULL)
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete for bad evnt");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete for bad evnt");
|
||||
else
|
||||
deleteFromList(precord,psl);
|
||||
} else if(scan==SCAN_IO_EVENT) {
|
||||
@@ -266,22 +278,26 @@ void scanDelete(struct dbCommon *precord)
|
||||
DEVSUPFUN get_ioint_info;
|
||||
|
||||
if(precord->dset==NULL) {
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid (no DSET)");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete: I/O Intr not valid (no DSET)");
|
||||
return;
|
||||
}
|
||||
get_ioint_info=precord->dset->get_ioint_info;
|
||||
if(get_ioint_info==NULL) {
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid (no get_ioint_info)");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete: I/O Intr not valid (no get_ioint_info)");
|
||||
return;
|
||||
}
|
||||
if(get_ioint_info(1,precord,&piosl)) return;/*return if error*/
|
||||
if(piosl==NULL) {
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete: I/O Intr not valid");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete: I/O Intr not valid");
|
||||
return;
|
||||
}
|
||||
priority = precord->prio;
|
||||
if(priority<0 || priority>=NUM_CALLBACK_PRIORITIES) {
|
||||
recGblRecordError(-1,(void *)precord,"scanDelete: get_ioint_info returned illegal priority");
|
||||
recGblRecordError(-1,(void *)precord,
|
||||
"scanDelete: get_ioint_info returned illegal priority");
|
||||
return;
|
||||
}
|
||||
piosl += priority; /*get piosl for correct priority*/
|
||||
@@ -382,8 +398,14 @@ void scanIoRequest(IOSCANPVT pioscanpvt)
|
||||
|
||||
void scanOnce(void *precord)
|
||||
{
|
||||
if(rngBufPut(onceQ,(void *)&precord,sizeof(precord))!=sizeof(precord))
|
||||
errMessage(0,"rngBufPut overflow in scanOnce");
|
||||
static int newOverflow=TRUE;
|
||||
|
||||
if(rngBufPut(onceQ,(void *)&precord,sizeof(precord))!=sizeof(precord)) {
|
||||
if(newOverflow)errMessage(0,"rngBufPut overflow in scanOnce");
|
||||
newOverflow = FALSE;
|
||||
}else {
|
||||
newOverflow = TRUE;
|
||||
}
|
||||
semGive(onceSem);
|
||||
}
|
||||
|
||||
@@ -438,54 +460,17 @@ static void periodicTask(struct scan_list *psl)
|
||||
|
||||
static void initPeriodic()
|
||||
{
|
||||
struct {
|
||||
DBRenumStrs
|
||||
} scanChoices;
|
||||
struct scan_list *psl;
|
||||
struct dbAddr dbAddr; /* database address */
|
||||
struct recHeader *precHeader;
|
||||
struct recLoc *precLoc;
|
||||
RECNODE *precNode;
|
||||
struct dbCommon *precord=NULL; /* pointer to record */
|
||||
long status,nRequest,options;
|
||||
void *pfl=NULL;
|
||||
dbMenu *pmenu;
|
||||
struct scan_list *psl;
|
||||
float temp;
|
||||
int i;
|
||||
char name[PVNAME_SZ+FLDNAME_SZ+2];
|
||||
float temp;
|
||||
|
||||
if(!(precHeader = pdbBase->precHeader)) {
|
||||
errMessage(S_record_noRecords, "initPeriodic");
|
||||
exit(1);
|
||||
}
|
||||
/* look for first record */
|
||||
for (i=0; i<precHeader->number; i++) {
|
||||
if((precLoc=precHeader->papRecLoc[i])==NULL) continue;
|
||||
if(!precLoc->preclist) continue;
|
||||
for(precNode=(RECNODE *)ellFirst(precLoc->preclist);
|
||||
precNode; precNode = (RECNODE *)ellNext(&precNode->node)) {
|
||||
precord = precNode->precord;
|
||||
if(precord->name[0]!=0) goto got_record;
|
||||
}
|
||||
}
|
||||
errMessage(S_record_noRecords,"initPeriodic");
|
||||
return;
|
||||
got_record:
|
||||
/* get database address of SCAN field */
|
||||
name[PVNAME_SZ] = 0;
|
||||
strncpy(name,precord->name,PVNAME_SZ);
|
||||
strcat(name,".SCAN");
|
||||
if ((status=dbNameToAddr(name,&dbAddr)) != 0){
|
||||
recGblDbaddrError(status,&dbAddr,"initPeriodic");
|
||||
exit(1);
|
||||
}
|
||||
options = DBR_ENUM_STRS;
|
||||
nRequest = 0;
|
||||
status = dbGetField(&dbAddr,DBR_ENUM,&scanChoices,&options,&nRequest,pfl);
|
||||
nPeriodic = scanChoices.no_str - SCAN_1ST_PERIODIC;
|
||||
if(status || options!=DBR_ENUM_STRS || nPeriodic<=0) {
|
||||
recGblDbaddrError(status,&dbAddr,"initPeriodic");
|
||||
exit(1);
|
||||
pmenu = dbFindMenu(pdbbase,"menuScan");
|
||||
if(!pmenu) {
|
||||
epicsPrintf("initPeriodic: menuScan not present\n");
|
||||
return;
|
||||
}
|
||||
nPeriodic = pmenu->nChoice - SCAN_1ST_PERIODIC;
|
||||
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list*));
|
||||
periodicTaskId = dbCalloc(nPeriodic,sizeof(int));
|
||||
for(i=0; i<nPeriodic; i++) {
|
||||
@@ -493,7 +478,7 @@ got_record:
|
||||
papPeriodic[i] = psl;
|
||||
FASTLOCKINIT(&psl->lock);
|
||||
ellInit(&psl->list);
|
||||
sscanf(scanChoices.strs[i+SCAN_1ST_PERIODIC],"%f",&temp);
|
||||
sscanf(pmenu->papChoiceValue[i+SCAN_1ST_PERIODIC],"%f",&temp);
|
||||
psl->ticks = temp * vxTicksPerSecond;
|
||||
}
|
||||
}
|
||||
@@ -598,7 +583,7 @@ static void printList(struct scan_list *psl,char *message)
|
||||
struct scan_element *pse;
|
||||
|
||||
FASTLOCK(&psl->lock);
|
||||
(void *)pse = ellFirst(&psl->list);
|
||||
pse = (struct scan_element *)ellFirst(&psl->list);
|
||||
FASTUNLOCK(&psl->lock);
|
||||
if(pse==NULL) return;
|
||||
printf("%s\n",message);
|
||||
@@ -610,7 +595,7 @@ static void printList(struct scan_list *psl,char *message)
|
||||
printf("Returning because list changed while processing.");
|
||||
return;
|
||||
}
|
||||
(void *)pse = ellNext((void *)pse);
|
||||
pse = (struct scan_element *)ellNext((void *)pse);
|
||||
FASTUNLOCK(&psl->lock);
|
||||
}
|
||||
}
|
||||
@@ -624,9 +609,9 @@ static void scanList(struct scan_list *psl)
|
||||
|
||||
FASTLOCK(&psl->lock);
|
||||
psl->modified = FALSE;
|
||||
(void *)pse = ellFirst(&psl->list);
|
||||
pse = (struct scan_element *)ellFirst(&psl->list);
|
||||
prev = NULL;
|
||||
(void *)next = ellNext((void *)pse);
|
||||
next = (struct scan_element *)ellNext((void *)pse);
|
||||
FASTUNLOCK(&psl->lock);
|
||||
while(pse!=NULL) {
|
||||
struct dbCommon *precord = pse->precord;
|
||||
@@ -637,27 +622,27 @@ static void scanList(struct scan_list *psl)
|
||||
FASTLOCK(&psl->lock);
|
||||
if(!psl->modified) {
|
||||
prev = pse;
|
||||
(void *)pse = ellNext((void *)pse);
|
||||
if(pse!=NULL) (void *)next = ellNext((void *)pse);
|
||||
pse = (struct scan_element *)ellNext((void *)pse);
|
||||
if(pse!=NULL)next = (struct scan_element *)ellNext((void *)pse);
|
||||
} else if (pse->pscan_list==psl) {
|
||||
/*This scan element is still in same scan list*/
|
||||
prev = pse;
|
||||
(void *)pse = ellNext((void *)pse);
|
||||
if(pse!=NULL) (void *)next = ellNext((void *)pse);
|
||||
pse = (struct scan_element *)ellNext((void *)pse);
|
||||
if(pse!=NULL)next = (struct scan_element *)ellNext((void *)pse);
|
||||
psl->modified = FALSE;
|
||||
} else if (prev!=NULL && prev->pscan_list==psl) {
|
||||
/*Previous scan element is still in same scan list*/
|
||||
(void *)pse = ellNext((void *)prev);
|
||||
pse = (struct scan_element *)ellNext((void *)prev);
|
||||
if(pse!=NULL) {
|
||||
(void *)prev = ellPrevious((void *)pse);
|
||||
(void *)next = ellNext((void *)pse);
|
||||
prev = (struct scan_element *)ellPrevious((void *)pse);
|
||||
next = (struct scan_element *)ellNext((void *)pse);
|
||||
}
|
||||
psl->modified = FALSE;
|
||||
} else if (next!=NULL && next->pscan_list==psl) {
|
||||
/*Next scan element is still in same scan list*/
|
||||
pse = next;
|
||||
(void *)prev = ellPrevious((void *)pse);
|
||||
(void *)next = ellNext((void *)pse);
|
||||
prev = (struct scan_element *)ellPrevious((void *)pse);
|
||||
next = (struct scan_element *)ellNext((void *)pse);
|
||||
psl->modified = FALSE;
|
||||
} else {
|
||||
/*Too many changes. Just wait till next period*/
|
||||
@@ -670,27 +655,20 @@ static void scanList(struct scan_list *psl)
|
||||
|
||||
static void buildScanLists(void)
|
||||
{
|
||||
struct recHeader *precHeader;
|
||||
struct recLoc *precLoc;
|
||||
RECNODE *precNode;
|
||||
struct dbCommon *precord; /* pointer to record */
|
||||
int i;
|
||||
dbRecDes *pdbRecDes;
|
||||
dbRecordNode *pdbRecordNode;
|
||||
dbCommon *precord;
|
||||
|
||||
if(!(precHeader = pdbBase->precHeader)) {
|
||||
errMessage(S_record_noRecords,
|
||||
"Error detected in build_scan_lists");
|
||||
exit(1);
|
||||
}
|
||||
/* look through all of the database records and place them on lists */
|
||||
for (i=0; i<precHeader->number; i++) {
|
||||
if((precLoc=precHeader->papRecLoc[i])==NULL) continue;
|
||||
if(!precLoc->preclist) continue;
|
||||
for(precNode=(RECNODE *)ellFirst(precLoc->preclist);
|
||||
precNode; precNode = (RECNODE *)ellNext(&precNode->node)) {
|
||||
precord = precNode->precord;
|
||||
if(precord->name[0]==0) continue;
|
||||
scanAdd(precord);
|
||||
}
|
||||
/*Look for first record*/
|
||||
for(pdbRecDes = (dbRecDes *)ellFirst(&pdbbase->recDesList); pdbRecDes;
|
||||
pdbRecDes = (dbRecDes *)ellNext(&pdbRecDes->node)) {
|
||||
for (pdbRecordNode=(dbRecordNode *)ellFirst(&pdbRecDes->recList);
|
||||
pdbRecordNode;
|
||||
pdbRecordNode = (dbRecordNode *)ellNext(&pdbRecordNode->node)) {
|
||||
precord = pdbRecordNode->precord;
|
||||
if(precord->name[0]==0) continue;
|
||||
scanAdd(precord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -703,17 +681,17 @@ static void addToList(struct dbCommon *precord,struct scan_list *psl)
|
||||
if(pse==NULL) {
|
||||
pse = dbCalloc(1,sizeof(struct scan_element));
|
||||
precord->spvt = (void *)pse;
|
||||
(void *)pse->precord = precord;
|
||||
pse->precord = precord;
|
||||
}
|
||||
pse ->pscan_list = psl;
|
||||
(void *)ptemp = ellFirst(&psl->list);
|
||||
ptemp = (struct scan_element *)ellFirst(&psl->list);
|
||||
while(ptemp!=NULL) {
|
||||
if(ptemp->precord->phas>precord->phas) {
|
||||
ellInsert(&psl->list,
|
||||
ellPrevious((void *)ptemp),(void *)pse);
|
||||
break;
|
||||
}
|
||||
(void *)ptemp = ellNext((void *)ptemp);
|
||||
ptemp = (struct scan_element *)ellNext((void *)ptemp);
|
||||
}
|
||||
if(ptemp==NULL) ellAdd(&psl->list,(void *)pse);
|
||||
psl->modified = TRUE;
|
||||
|
||||
803
src/db/dbTest.c
803
src/db/dbTest.c
File diff suppressed because it is too large
Load Diff
@@ -129,6 +129,9 @@
|
||||
#define MAX_STRING_SIZE 40
|
||||
#endif
|
||||
|
||||
#ifndef MAX_UNITS_SIZE
|
||||
#define MAX_UNITS_SIZE 8
|
||||
#endif
|
||||
|
||||
/* VALUES WITH STATUS STRUCTURES */
|
||||
|
||||
@@ -269,7 +272,7 @@ struct dbr_time_double{
|
||||
struct dbr_gr_int{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
short upper_disp_limit; /* upper limit of graph */
|
||||
short lower_disp_limit; /* lower limit of graph */
|
||||
short upper_alarm_limit;
|
||||
@@ -281,7 +284,7 @@ struct dbr_gr_int{
|
||||
struct dbr_gr_short{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
short upper_disp_limit; /* upper limit of graph */
|
||||
short lower_disp_limit; /* lower limit of graph */
|
||||
short upper_alarm_limit;
|
||||
@@ -297,7 +300,7 @@ struct dbr_gr_float{
|
||||
short severity; /* severity of alarm */
|
||||
short precision; /* number of decimal places */
|
||||
short RISC_pad0; /* RISC alignment */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
float upper_disp_limit; /* upper limit of graph */
|
||||
float lower_disp_limit; /* lower limit of graph */
|
||||
float upper_alarm_limit;
|
||||
@@ -320,7 +323,7 @@ struct dbr_gr_enum{
|
||||
struct dbr_gr_char{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
unsigned char upper_disp_limit; /* upper limit of graph */
|
||||
unsigned char lower_disp_limit; /* lower limit of graph */
|
||||
unsigned char upper_alarm_limit;
|
||||
@@ -335,7 +338,7 @@ struct dbr_gr_char{
|
||||
struct dbr_gr_long{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
long upper_disp_limit; /* upper limit of graph */
|
||||
long lower_disp_limit; /* lower limit of graph */
|
||||
long upper_alarm_limit;
|
||||
@@ -351,7 +354,7 @@ struct dbr_gr_double{
|
||||
short severity; /* severity of alarm */
|
||||
short precision; /* number of decimal places */
|
||||
short RISC_pad0; /* RISC alignment */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
double upper_disp_limit; /* upper limit of graph */
|
||||
double lower_disp_limit; /* lower limit of graph */
|
||||
double upper_alarm_limit;
|
||||
@@ -370,7 +373,7 @@ struct dbr_gr_double{
|
||||
struct dbr_ctrl_int{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
short upper_disp_limit; /* upper limit of graph */
|
||||
short lower_disp_limit; /* lower limit of graph */
|
||||
short upper_alarm_limit;
|
||||
@@ -384,7 +387,7 @@ struct dbr_ctrl_int{
|
||||
struct dbr_ctrl_short{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
short upper_disp_limit; /* upper limit of graph */
|
||||
short lower_disp_limit; /* lower limit of graph */
|
||||
short upper_alarm_limit;
|
||||
@@ -402,7 +405,7 @@ struct dbr_ctrl_float{
|
||||
short severity; /* severity of alarm */
|
||||
short precision; /* number of decimal places */
|
||||
short RISC_pad; /* RISC alignment */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
float upper_disp_limit; /* upper limit of graph */
|
||||
float lower_disp_limit; /* lower limit of graph */
|
||||
float upper_alarm_limit;
|
||||
@@ -427,7 +430,7 @@ struct dbr_ctrl_enum{
|
||||
struct dbr_ctrl_char{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
unsigned char upper_disp_limit; /* upper limit of graph */
|
||||
unsigned char lower_disp_limit; /* lower limit of graph */
|
||||
unsigned char upper_alarm_limit;
|
||||
@@ -444,7 +447,7 @@ struct dbr_ctrl_char{
|
||||
struct dbr_ctrl_long{
|
||||
short status; /* status of value */
|
||||
short severity; /* severity of alarm */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
long upper_disp_limit; /* upper limit of graph */
|
||||
long lower_disp_limit; /* lower limit of graph */
|
||||
long upper_alarm_limit;
|
||||
@@ -462,7 +465,7 @@ struct dbr_ctrl_double{
|
||||
short severity; /* severity of alarm */
|
||||
short precision; /* number of decimal places */
|
||||
short RISC_pad0; /* RISC alignment */
|
||||
char units[8]; /* units of value */
|
||||
char units[MAX_UNITS_SIZE]; /* units of value */
|
||||
double upper_disp_limit; /* upper limit of graph */
|
||||
double lower_disp_limit; /* lower limit of graph */
|
||||
double upper_alarm_limit;
|
||||
@@ -1017,7 +1020,8 @@ void *pfl;
|
||||
pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1051,7 +1055,8 @@ void *pfl;
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
pold->precision = new.precision;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1083,7 +1088,8 @@ void *pfl;
|
||||
pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1114,7 +1120,8 @@ void *pfl;
|
||||
pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1148,7 +1155,8 @@ void *pfl;
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
pold->precision = new.precision;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1182,7 +1190,8 @@ void *pfl;
|
||||
pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1219,7 +1228,8 @@ void *pfl;
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
pold->precision = new.precision;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1286,7 +1296,8 @@ void *pfl;
|
||||
pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1320,7 +1331,8 @@ void *pfl;
|
||||
status = dbGetField(paddr,DBR_LONG,&new,&options,&nRequest,pfl);
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
@@ -1357,7 +1369,8 @@ void *pfl;
|
||||
pold->status = new.status;
|
||||
pold->severity = new.severity;
|
||||
pold->precision = new.precision;
|
||||
strncpy(pold->units,new.units,8);
|
||||
strncpy(pold->units,new.units,MAX_UNITS_SIZE);
|
||||
pold->units[MAX_UNITS_SIZE-1] = '\0';
|
||||
pold->upper_disp_limit = new.upper_disp_limit;
|
||||
pold->lower_disp_limit = new.lower_disp_limit;
|
||||
pold->upper_alarm_limit = new.upper_alarm_limit;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user