Compare commits
99 Commits
R3.14.12.2
...
R3.14.12.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a5999242b0 | ||
|
|
9e484306d6 | ||
|
|
835199a45d | ||
|
|
0df6f849d6 | ||
|
|
75e32c9086 | ||
|
|
b7018dd16d | ||
|
|
3498a6d4e0 | ||
|
|
f90f021309 | ||
|
|
c1203076f2 | ||
|
|
753622315c | ||
|
|
910ab38af6 | ||
|
|
0e990bbe0c | ||
|
|
ef5688f8de | ||
|
|
d622bbad05 | ||
|
|
416cf68fd1 | ||
|
|
cbde3ea9fd | ||
|
|
6f9c2db8a8 | ||
|
|
01276d952f | ||
|
|
809633d698 | ||
|
|
1f573172b3 | ||
|
|
d6f72900f8 | ||
|
|
5b1d3a7725 | ||
|
|
7d79a83519 | ||
|
|
6fd9fb3066 | ||
|
|
28c7fe12f3 | ||
|
|
36be0aa783 | ||
|
|
69d8be78d3 | ||
|
|
fc61cc34ce | ||
|
|
e889336458 | ||
|
|
7cac267a4b | ||
|
|
71079ede4b | ||
|
|
26173c1e0d | ||
|
|
9c1b8ba952 | ||
|
|
c574722a9b | ||
|
|
4790578953 | ||
|
|
7e6e38060f | ||
|
|
709b6ef2f3 | ||
|
|
169b30081a | ||
|
|
a19e1d21da | ||
|
|
1ac8ff6378 | ||
|
|
5c2ef73c4a | ||
|
|
958aa02320 | ||
|
|
c93c7b5e36 | ||
|
|
b993e29fad | ||
|
|
e03d10857c | ||
|
|
bdbada28a8 | ||
|
|
20c9fa2e8a | ||
|
|
b1ac0c18c4 | ||
|
|
4133b666a0 | ||
|
|
dabd0a969b | ||
|
|
1864ac41fb | ||
|
|
1649ce6f79 | ||
|
|
93bc78d2ed | ||
|
|
32f556637d | ||
|
|
146520d035 | ||
|
|
ea8d19e727 | ||
|
|
39ca40fc33 | ||
|
|
b5e1b0117c | ||
|
|
c1cebc89bf | ||
|
|
4982a6308b | ||
|
|
243baddbf6 | ||
|
|
45348ad6ca | ||
|
|
dde8c61ad8 | ||
|
|
0a0302daad | ||
|
|
8ed86967d1 | ||
|
|
129710f149 | ||
|
|
bcd604e40b | ||
|
|
dffe203856 | ||
|
|
6f8f61db64 | ||
|
|
e48ca8a688 | ||
|
|
7435a9831b | ||
|
|
10e7bced84 | ||
|
|
df7fa22a15 | ||
|
|
140845fb14 | ||
|
|
3dec8f8c78 | ||
|
|
6f9f5498b4 | ||
|
|
f5bc02393e | ||
|
|
f86cf730e9 | ||
|
|
73768aae9a | ||
|
|
adfa1257f5 | ||
|
|
7cc8a552a3 | ||
|
|
afaebfbeb1 | ||
|
|
ee2a2dfffc | ||
|
|
2d6f8c585a | ||
|
|
c538fc8ccc | ||
|
|
c32997ffa1 | ||
|
|
d8f7c3731d | ||
|
|
0c67efd50a | ||
|
|
5b0693f53d | ||
|
|
36be34656e | ||
|
|
4a5b8a37df | ||
|
|
e289af684f | ||
|
|
8cb8ad081b | ||
|
|
52ee9916e6 | ||
|
|
3fc6a77fb0 | ||
|
|
df6f042b5a | ||
|
|
3b268475d3 | ||
|
|
2010e58c61 | ||
|
|
54401d5426 |
@@ -14,8 +14,8 @@ define RELEASE_FLAGS_template
|
||||
SHRLIB_SEARCH_DIRS += $$($(1)_LIB)
|
||||
RELEASE_INCLUDES += $$(addprefix -I,$$(wildcard $$(strip $$($(1)))/include/os/$$(OS_CLASS)))
|
||||
RELEASE_INCLUDES += $$(addprefix -I,$$(wildcard $$(strip $$($(1)))/include))
|
||||
RELEASE_DBDFLAGS += $$(addprefix -I,$$(wildcard $$(strip $$($(1)))/dbd))
|
||||
RELEASE_DBFLAGS += $$(addprefix -I,$$(wildcard $$(strip $$($(1)))/db))
|
||||
RELEASE_DBD_DIRS += $$(wildcard $$(strip $$($(1)))/dbd)
|
||||
RELEASE_DB_DIRS += $$(wildcard $$(strip $$($(1)))/db)
|
||||
RELEASE_PERL_MODULE_DIRS += $$(wildcard $$($(1)_LIB)/perl)
|
||||
endef
|
||||
$(foreach top, $(RELEASE_TOPS), $(eval $(call RELEASE_FLAGS_template,$(top)) ))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, as Operator of Argonne
|
||||
# Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
@@ -30,19 +30,19 @@ EPICS_MODIFICATION = 12
|
||||
|
||||
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
|
||||
# Not included if zero
|
||||
EPICS_PATCH_LEVEL = 2
|
||||
EPICS_PATCH_LEVEL = 3
|
||||
|
||||
# This will end in -DEV between official releases
|
||||
#EPICS_DEV_SNAPSHOT=-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre1
|
||||
#PICS_DEV_SNAPSHOT=-pre1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre2
|
||||
#EPICS_DEV_SNAPSHOT=-pre2-DEV
|
||||
EPICS_DEV_SNAPSHOT=-rc1
|
||||
#EPICS_DEV_SNAPSHOT=-rc1
|
||||
#EPICS_DEV_SNAPSHOT=-rc1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-rc2
|
||||
#EPICS_DEV_SNAPSHOT=-rc2-DEV
|
||||
#EPICS_DEV_SNAPSHOT=
|
||||
EPICS_DEV_SNAPSHOT=
|
||||
|
||||
# No changes should be needed below here
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ DB_OPT = NO
|
||||
#-------------------------------------------------------
|
||||
# Check configure/RELEASE file for consistency
|
||||
CHECK_RELEASE_YES = checkRelease
|
||||
CHECK_RELEASE_NO =
|
||||
CHECK_RELEASE_NO = noCheckRelease
|
||||
CHECK_RELEASE_WARN = warnRelease
|
||||
|
||||
#-------------------------------------------------------
|
||||
@@ -81,8 +81,8 @@ COMMON_DIR = ../O.Common
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Make echo output - suppress echoing if make's '-s' flag is set
|
||||
COMMENT = \#
|
||||
ECHO = @$(if $(findstring s,$(patsubst T_A=%,,$(MAKEFLAGS))),$(COMMENT),echo)
|
||||
NOP = :
|
||||
ECHO = @$(if $(findstring s,$(patsubst T_A=%,,$(MAKEFLAGS))),$(NOP),echo)
|
||||
|
||||
#-------------------------------------------------------
|
||||
ifdef T_A
|
||||
@@ -371,6 +371,7 @@ INSTALL_LIB_INSTALLS = $(addprefix $(INSTALL_LIB)/,$(notdir $(LIB_INSTALLS)))
|
||||
# Installed file permissions
|
||||
BIN_PERMISSIONS = 555
|
||||
LIB_PERMISSIONS = 444
|
||||
SHRLIB_PERMISSIONS = 555
|
||||
INSTALL_PERMISSIONS = 444
|
||||
|
||||
#---------------------------------------------------------------
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
# linux-cris (Axis GNU crosscompiler on linux-x86 host)
|
||||
# linux-cris_v10 (Axis GNU crosscompiler on linux-x86 host)
|
||||
# linux-cris_v32 (Axis GNU crosscompiler on linux-x86 host)
|
||||
# linux-microblaze
|
||||
# linux-xscale_be
|
||||
# vxWorks-486
|
||||
# vxWorks-68040
|
||||
@@ -119,9 +120,9 @@ CROSS_COMPILER_HOST_ARCHS=
|
||||
# NOTE: os/CONFIG.$(EPICS_HOST_ARCH).$(EPICS_HOST_ARCH) files and
|
||||
# os/CONFIG_SITE.$(EPICS_HOST_ARCH).$(EPICS_HOST_ARCH) files may override
|
||||
#
|
||||
# NOTE WIN32: YES results in a DLL. Valid settings are
|
||||
# SHARED_LIBRARIES=YES and STATIC_BUILD=NO
|
||||
# SHARED_LIBRARIES=NO and STATIC_BUILD=YES
|
||||
# NOTE Windows: YES results in a DLL. Valid settings are
|
||||
# SHARED_LIBRARIES=YES and STATIC_BUILD=NO
|
||||
# SHARED_LIBRARIES=NO and STATIC_BUILD=YES
|
||||
#
|
||||
SHARED_LIBRARIES=YES
|
||||
|
||||
@@ -183,7 +184,9 @@ EPICS_SITE_VERSION =
|
||||
# between the various stages of compilation.
|
||||
GCC_PIPE = NO
|
||||
|
||||
# Include RPATH when linking executables and libraries.
|
||||
# must be either YES or NO
|
||||
LINKER_USE_RPATH=YES
|
||||
# Set RPATH when linking executables and libraries.
|
||||
# Must be either YES or NO. If you set this to NO you must also provide a
|
||||
# way for Base executables to find their shared libraries when they are
|
||||
# run at build-time, e.g. set the LD_LIBRARY_PATH environment variable.
|
||||
LINKER_USE_RPATH = YES
|
||||
|
||||
|
||||
@@ -21,11 +21,11 @@ vpath %.acs $(USR_VPATH) $(GENERIC_SRC_DIRS) $(COMMON_DIR)
|
||||
|
||||
##################################################### dbdflags
|
||||
|
||||
# dbExpand
|
||||
INSTALL_DBDFLAGS += -I $(INSTALL_DBD)
|
||||
INSTALL_DBFLAGS += -I $(INSTALL_DB)
|
||||
DBDFLAGS = $(USR_DBDFLAGS) -I . -I .. $(INSTALL_DBDFLAGS) $(RELEASE_DBDFLAGS)
|
||||
DBFLAGS = $($*_DBFLAGS) $(USR_DBFLAGS) -I. -I.. $(INSTALL_DBFLAGS) $(RELEASE_DBFLAGS)
|
||||
DBD_SEARCH_DIRS = . .. $(COMMON_DIR) $(SRC_DIRS) $(INSTALL_DBD) $(RELEASE_DBD_DIRS)
|
||||
DB_SEARCH_DIRS = . .. $(COMMON_DIR) $(SRC_DIRS) $(INSTALL_DB) $(RELEASE_DB_DIRS)
|
||||
|
||||
DBDFLAGS = $(USR_DBDFLAGS) $(addprefix -I,$(DBD_SEARCH_DIRS))
|
||||
DBFLAGS = $($*_DBFLAGS) $(USR_DBFLAGS) $(addprefix -I,$(DB_SEARCH_DIRS))
|
||||
|
||||
#####################################################
|
||||
# To allow os specific dbd files AND have the -j option work properly,
|
||||
@@ -100,7 +100,7 @@ ACF_CPPFLAGS = $(ACF_CPPFLAGS_$(GNU))
|
||||
|
||||
ACF_INCLUDES = -I. $(TARGET_INCLUDES) $(USR_INCLUDES)\
|
||||
$(SRC_INCLUDES) -I$(INSTALL_DB)
|
||||
ACFDEPENDS_CMD = -$(MKMF) -m $(notdir $@)$(DEP) $(subst -I,,$(ACF_INCLUDES)) $@ $<
|
||||
ACFDEPENDS_CMD = -$(MKMF) -m $(notdir $@)$(DEP) $(ACF_INCLUDES) $@ $<
|
||||
ACF_CMD = $(CPP) $(ACF_CPPFLAGS) $(ACF_INCLUDES) $< > $@
|
||||
|
||||
##################################################### dependancies
|
||||
@@ -112,16 +112,13 @@ DBDDEPENDS_FILES += $(addsuffix $(DEP),$(HINC) \
|
||||
$(patsubst $(COMMON_DIR)/%,%,$(COMMON_DBS)) \
|
||||
$(patsubst $(COMMON_DIR)/%,%,$(COMMON_DBDS)))
|
||||
|
||||
DBDDEPENDS_FLAGS = $(subst -I,,$(filter-out -S%,$(DBDFLAGS)))
|
||||
DBDDEPENDS_FLAGS = $(filter-out -S%,$(DBDFLAGS))
|
||||
DBDDEPENDS_CMD = -$(MKMF) -m $(notdir $@)$(DEP) $(DBDDEPENDS_FLAGS) $@ $<
|
||||
|
||||
MAKEDBDEPENDS = $(PERL) $(TOOLS)/makeDbDepends.pl
|
||||
|
||||
#####################################################
|
||||
|
||||
ifndef T_A
|
||||
|
||||
ECHO := $(if $(findstring s,$(MAKEFLAGS)),$(COMMENT),@echo)
|
||||
COMMON_DIR = .
|
||||
INSTALL_DBDS =
|
||||
INSTALL_DBS =
|
||||
@@ -231,7 +228,7 @@ $(COMMON_DIR)/%Record.h: $(COMMON_DIR)/%Record.dbd
|
||||
$(COMMON_DIR)/%Record.h: %Record.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
echo "$@ : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTORECORDTYPEH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
@@ -247,7 +244,7 @@ $(COMMON_DIR)/menu%.h: $(COMMON_DIR)/menu%.dbd
|
||||
$(COMMON_DIR)/menu%.h: menu%.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
echo "$@ : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBTOMENUH) $(DBDFLAGS) $< $(notdir $@)
|
||||
@$(MV) $(notdir $@) $@
|
||||
@@ -272,7 +269,7 @@ $(COMMON_DIR)/%.dbd: $(COMMON_DIR)/%Include.dbd
|
||||
$(COMMON_DIR)/%.dbd: %Include.dbd
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(DBDDEPENDS_CMD)
|
||||
echo "$< : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
echo "$@ : ../Makefile" >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "Expanding dbd"
|
||||
@$(RM) $(notdir $@)
|
||||
$(DBEXPAND) $(DBDFLAGS) -o $(notdir $@) $<
|
||||
@@ -309,8 +306,9 @@ $(COMMON_DIR)/%.db$(RAW): $(COMMON_DIR)/%.edf
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): %.substitutions
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(MAKEDBDEPENDS) $@ $< $(TEMPLATE_FILENAME) >> $(notdir $@)$(DEP)
|
||||
@$(MKMF) -m$(notdir $@)$(DEP) $(DBFLAGS) $@ $< $(TEMPLATE_FILENAME)
|
||||
echo "$@ : $(TEMPLATE_FILENAME)" >> $(notdir $@)$(DEP)
|
||||
echo "$(notdir $@)$(DEP): $(TEMPLATE_FILENAME)" >> $(notdir $@)$(DEP)
|
||||
$(ECHO) "Inflating database from $< $(TEMPLATE_FILENAME)"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) -S$< $(TEMPLATE_FILENAME) > $*.tmp
|
||||
@@ -318,7 +316,7 @@ $(COMMON_DIR)/%.db$(RAW): %.substitutions
|
||||
|
||||
$(COMMON_DIR)/%.db$(RAW): %.template
|
||||
@$(RM) $(notdir $@)$(DEP)
|
||||
@$(MAKEDBDEPENDS) $@ $^ >> $(notdir $@)$(DEP)
|
||||
@$(MKMF) -m$(notdir $@)$(DEP) $(DBFLAGS) $@ $< $(TEMPLATE_FILENAME)
|
||||
$(ECHO) "Inflating database from $<"
|
||||
@$(RM) $@ $*.tmp
|
||||
$(MSI) $(DBFLAGS) $< > $*.tmp
|
||||
|
||||
@@ -22,6 +22,7 @@ vpath %.cpp $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.C $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.rc $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.h $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.H $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.skel.static $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.y $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
vpath %.l $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
@@ -167,6 +168,10 @@ checkRelease:
|
||||
$(CONVERTRELEASE) checkRelease
|
||||
warnRelease:
|
||||
-$(CONVERTRELEASE) checkRelease
|
||||
noCheckRelease:
|
||||
ifeq ($(EPICS_HOST_ARCH),$(T_A))
|
||||
@echo "Warning: RELEASE file consistency checks have been disabled"
|
||||
endif
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# The order of the following rules is
|
||||
@@ -317,10 +322,10 @@ $(OBJLIB_MUNCHNAME):%.munch : %_ctdt$(OBJ) %$(OBJ)
|
||||
@$(RM) $@
|
||||
$(MUNCH_CMD)
|
||||
|
||||
runtests: $(TESTSCRIPTS_$(BUILD_CLASS))
|
||||
runtests: $(TESTSCRIPTS)
|
||||
-$(PERL) -MTest::Harness -e 'runtests @ARGV if @ARGV;' $^
|
||||
|
||||
testspec: $(TESTSCRIPTS_$(BUILD_CLASS))
|
||||
testspec: $(TESTSCRIPTS)
|
||||
@$(RM) $@
|
||||
@echo OS-class: $(OS_CLASS) > $@
|
||||
@echo Target-arch: $(T_A) >> $@
|
||||
@@ -378,11 +383,11 @@ $(INSTALL_LIB)/%.lib: %.lib
|
||||
|
||||
$(INSTALL_SHRLIBS): $(INSTALL_SHRLIB)/%: %
|
||||
$(ECHO) "Installing shared library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m $(LIB_PERMISSIONS) $< $(INSTALL_SHRLIB)
|
||||
ifneq ($(SHRLIB_SUFFIX),.dll)
|
||||
@$(INSTALL_LIBRARY) -d -m $(SHRLIB_PERMISSIONS) $< $(INSTALL_SHRLIB)
|
||||
ifneq ($(SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE))
|
||||
ifneq (,$(strip $(SHRLIB_VERSION)))
|
||||
@$(RM) $(subst .$(SHRLIB_VERSION),,$@)
|
||||
ln -s $< $(subst .$(SHRLIB_VERSION),,$@)
|
||||
@$(RM) $(subst $(SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE),$@)
|
||||
ln -s $< $(subst $(SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE),$@)
|
||||
endif # SHRLIB_VERSION
|
||||
endif # SHRLIB_SUFFIX
|
||||
|
||||
@@ -403,10 +408,12 @@ $(INSTALL_TCLLIB)/$(TCLINDEX): $(INSTALL_TCLLIBS)
|
||||
$(INSTALL_LOADABLE_SHRLIBS): $(INSTALL_SHRLIB)/%: %
|
||||
$(ECHO) "Installing loadable shared library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m 555 $< $(INSTALL_SHRLIB)
|
||||
ifneq ($(LOADABLE_SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE))
|
||||
ifneq (,$(strip $(LOADABLE_SHRLIB_VERSION)))
|
||||
@$(RM) $(subst .$(LOADABLE_SHRLIB_VERSION),,$@)
|
||||
ln -s $< $(subst .$(LOADABLE_SHRLIB_VERSION),,$@)
|
||||
@$(RM) $(subst $(LOADABLE_SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE),$@)
|
||||
ln -s $< $(subst $(LOADABLE_SHRLIB_SUFFIX),$(SHRLIB_SUFFIX_BASE),$@)
|
||||
endif # LOADABLE_SHRLIB_VERSION
|
||||
endif # LOADABLE_SHRLIB_SUFFIX
|
||||
|
||||
$(INSTALL_CONFIG)/%: %
|
||||
$(ECHO) "Installing config file $@"
|
||||
@@ -458,7 +465,7 @@ $(INSTALL_TEMPLATES_SUBDIR)/%: %
|
||||
.PRECIOUS: $(COMMON_INC)
|
||||
|
||||
.PHONY: all inc build install clean rebuild buildInstall
|
||||
.PHONY: runtests checkRelease warnRelease
|
||||
.PHONY: runtests checkRelease warnRelease noCheckRelease
|
||||
|
||||
endif # BASE_RULES_BUILD
|
||||
# EOF RULES_BUILD
|
||||
|
||||
@@ -19,8 +19,9 @@ OBJ = .o
|
||||
#Library prefix and suffixes
|
||||
LIB_PREFIX = lib
|
||||
LIB_SUFFIX = .a
|
||||
SHRLIB_SUFFIX = .so$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_SUFFIX = .so$(addprefix .,$(LOADABLE_SHRLIB_VERSION))
|
||||
SHRLIB_SUFFIX_BASE = .so
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)$(addprefix .,$(LOADABLE_SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_PREFIX = lib
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
@@ -14,7 +14,7 @@ OS_CLASS = cygwin32
|
||||
ARCH_CLASS = x86
|
||||
|
||||
# Definitions used when COMMANDLINE_LIBRARY is READLINE
|
||||
LDLIBS_READLINE = -lreadline -lcurses
|
||||
LDLIBS_READLINE = -lreadline
|
||||
|
||||
POSIX_CPPFLAGS = -D_POSIX_THREADS -D_POSIX_TIMERS
|
||||
#POSIX_CPPFLAGS += -D_POSIX_SOURCE
|
||||
@@ -48,11 +48,12 @@ STATIC_CXXFLAGS_NO= $(VISC_DLL) -D_DLL
|
||||
# But: if there are no objects LIBRARY_LD_OBJS to include
|
||||
# in this library (may be for e.g. base/src/libCompat
|
||||
# on some archs), don't define (and build) any library!
|
||||
SHRLIB_PREFIX=
|
||||
SHRLIB_SUFFIX=.dll
|
||||
SHRLIB_PREFIX =
|
||||
SHRLIB_SUFFIX_BASE = .dll
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
SHRLIBNAME_YES = $(BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
LOADABLE_SHRLIB_PREFIX=
|
||||
LOADABLE_SHRLIB_SUFFIX=.dll
|
||||
LOADABLE_SHRLIB_PREFIX =
|
||||
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
LOADABLE_SHRLIBNAME = $(LOADABLE_BUILD_LIBRARY:%=%$(LOADABLE_SHRLIB_SUFFIX))
|
||||
|
||||
#
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
# CONFIG.Common.ios-arm
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for ios-arm target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.ios-arm
|
||||
# or CONFIG_SITE.<host>.ios-arm
|
||||
#-------------------------------------------------------
|
||||
|
||||
IOS_PLATFORM = iPhoneOS
|
||||
|
||||
#
|
||||
# Architecture-specific information
|
||||
#
|
||||
ARCH_CLASS = armv6
|
||||
|
||||
OP_SYS_CFLAGS += -fno-inline-functions
|
||||
|
||||
# iOS optimization flags for arm architecture
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
# CONFIG.Common.ios-x86
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for ios-x86 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.ios-x86
|
||||
# or CONFIG_SITE.<host>.ios-x86
|
||||
#-------------------------------------------------------
|
||||
|
||||
IOS_PLATFORM = iPhoneSimulator
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for iOS target archs
|
||||
# Definitions for all Apple iOS builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.iosCommon
|
||||
# or CONFIG_SITE.<host>.iosCommon
|
||||
#-------------------------------------------------------
|
||||
@@ -29,16 +29,19 @@ SDK_DIR = $(PLATFORM_DIR)/Developer/SDKs/$(IOS_PLATFORM)$(IOS_VERSION).sdk
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Build architecture flags
|
||||
ARCH_DEP_CFLAGS += -arch $(ARCH_CLASS)
|
||||
ARCH_DEP_LDFLAGS += -arch $(ARCH_CLASS)
|
||||
# ARCH_CLASS must contain a list of CPU architectures which must be
|
||||
# valid arguments to the -arch options for the cc and ld commands.
|
||||
# ARCH_CLASS is defined in a CONFIG_SITE file which is not loaded
|
||||
# until after this file.
|
||||
#
|
||||
ARCH_DEP_FLAGS = $(addprefix -arch ,$(ARCH_CLASS))
|
||||
ARCH_DEP_CFLAGS += $(ARCH_DEP_FLAGS)
|
||||
ARCH_DEP_LDFLAGS += $(ARCH_DEP_FLAGS)
|
||||
|
||||
#--------------------------------------------------
|
||||
# Operating system flags
|
||||
OP_SYS_CFLAGS += -isysroot $(SDK_DIR) -D__IPHONE_OS_VERSION_MIN_REQUIRED=30200
|
||||
|
||||
#--------------------------------------------------
|
||||
# Don't try to use precompiled headers when converting sequencer files
|
||||
CPPSNCFLAGS += -no-cpp-precomp
|
||||
OP_SYS_LDFLAGS += -isysroot $(SDK_DIR)
|
||||
|
||||
#--------------------------------------------------
|
||||
# Always compile in debugging symbol table information
|
||||
@@ -48,23 +51,33 @@ OPT_CXXFLAGS_YES += -g
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Compiler definitions:
|
||||
# Use clang instead of gcc
|
||||
# Must use g++ still
|
||||
CC = $(GNU_BIN)/clang
|
||||
CCC = $(GNU_BIN)/c++
|
||||
|
||||
CC_GNU = gcc
|
||||
CCC_GNU = g++
|
||||
|
||||
CC_LLVM_GNU = llvm-gcc
|
||||
CCC_LLVM_GNU = llvm-g++
|
||||
|
||||
CC_CLANG = clang
|
||||
CCC_CLANG = clang++
|
||||
|
||||
# Convert the iOS platform to lowercase for passing to xcrun's sdk parameter
|
||||
XCRUN_SDK_BASE = $(shell echo $(IOS_PLATFORM) | tr A-Z a-z)
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Linker flags
|
||||
GNU_LDLIBS_YES =
|
||||
OP_SYS_LDFLAGS += -dynamic -Z -L$(SDK_DIR)/usr/lib -L$(SDK_DIR)/usr/lib/system
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Shared libraries
|
||||
SHRLIB_VERSION = $(EPICS_VERSION).$(EPICS_REVISION).$(EPICS_MODIFICATION)
|
||||
SHRLIB_LDFLAGS = -dynamiclib -flat_namespace -undefined suppress \
|
||||
-install_name $(shell perl $(TOOLS)/fullPathName.pl $(INSTALL_LIB))/$@ \
|
||||
-install_name $(shell $(PERL) $(TOOLS)/fullPathName.pl $(INSTALL_LIB))/$@ \
|
||||
-compatibility_version $(EPICS_VERSION).$(EPICS_REVISION) \
|
||||
-current_version $(SHRLIB_VERSION)
|
||||
SHRLIB_SUFFIX = .$(SHRLIB_VERSION).dylib
|
||||
SHRLIB_SUFFIX_BASE = .dylib
|
||||
SHRLIB_SUFFIX = .$(SHRLIB_VERSION)$(SHRLIB_SUFFIX_BASE)
|
||||
|
||||
LOADABLE_SHRLIB_LDFLAGS = -bundle -flat_namespace -undefined suppress
|
||||
|
||||
@@ -80,7 +93,17 @@ vpath %.m $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
%.o: %.m
|
||||
$(COMPILE.c) -c $<
|
||||
|
||||
#--------------------------------------------------
|
||||
# Header dependency file generation
|
||||
#
|
||||
HDEPENDS_METHOD = CMD
|
||||
|
||||
#--------------------------------------------------
|
||||
# Allow site overrides
|
||||
-include $(CONFIG)/os/CONFIG_SITE.Common.iosCommon
|
||||
-include $(CONFIG)/os/CONFIG_SITE.$(EPICS_HOST_ARCH).iosCommon
|
||||
|
||||
#--------------------------------------------------
|
||||
# Find the Xcode compilers for the specified SDK just once
|
||||
CC := $(shell xcrun -sdk $(XCRUN_SDK_BASE) -find $(CC_$(COMPILER)))
|
||||
CCC := $(shell xcrun -sdk $(XCRUN_SDK_BASE) -find $(CCC_$(COMPILER)))
|
||||
|
||||
@@ -11,9 +11,6 @@ include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
|
||||
ARCH_CLASS = arm
|
||||
|
||||
# Set a special definition for network order of Netwinder ARM floating point
|
||||
ARCH_DEP_CPPFLAGS += -D_ARM_NWFP_
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
VALID_BUILDS = Ioc
|
||||
GNU_TARGET = arm-linux
|
||||
|
||||
21
configure/os/CONFIG.Common.linux-microblaze
Normal file
21
configure/os/CONFIG.Common.linux-microblaze
Normal file
@@ -0,0 +1,21 @@
|
||||
# CONFIG.Common.linux-microblaze
|
||||
#
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for Xilinx MicroBlaze FPGA Soft Core Processor target builds.
|
||||
# This target has been tested with the Xilinx Spartan 6 MicroBlaze.
|
||||
|
||||
# Site-specific overrides of these definitions should be made in the file
|
||||
# CONFIG_SITE.Common.linux-microblaze
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
|
||||
ARCH_CLASS = microblaze
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
VALID_BUILDS = Ioc
|
||||
GNU_TARGET = microblazeel-unknown-linux-gnu
|
||||
CMPLR_PREFIX = $(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
@@ -5,7 +5,8 @@
|
||||
# Definitions for linux-xscale_be (big-endian) target builds.
|
||||
# This target has been tested with the MOXA UC-7408-LX Plus.
|
||||
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-xscale_be
|
||||
# Site-specific overrides of these definitions should be made in the file
|
||||
# CONFIG_SITE.Common.linux-xscale_be
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
@@ -13,11 +14,6 @@ include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
|
||||
ARCH_CLASS = xscale
|
||||
|
||||
#
|
||||
# The vendor's tool chain needs to be located here
|
||||
#
|
||||
GNU_DIR=/usr/local/xscale_be
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
VALID_BUILDS = Ioc
|
||||
GNU_TARGET = xscale_be
|
||||
|
||||
@@ -55,11 +55,12 @@ STATIC_CXXFLAGS_NO= $(VISC_DLL) -D_DLL
|
||||
# But: if there are no objects LIBRARY_LD_OBJS to include
|
||||
# in this library (may be for e.g. base/src/libCompat
|
||||
# on some archs), don't define (and build) any library!
|
||||
SHRLIB_PREFIX=
|
||||
SHRLIB_SUFFIX=.dll
|
||||
SHRLIB_PREFIX =
|
||||
SHRLIB_SUFFIX_BASE = .dll
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
SHRLIBNAME_YES = $(BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
LOADABLE_SHRLIB_PREFIX=
|
||||
LOADABLE_SHRLIB_SUFFIX=.dll
|
||||
LOADABLE_SHRLIB_PREFIX =
|
||||
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
LOADABLE_SHRLIBNAME = $(LOADABLE_BUILD_LIBRARY:%=%$(LOADABLE_SHRLIB_SUFFIX))
|
||||
|
||||
#
|
||||
|
||||
@@ -49,11 +49,12 @@ STATIC_CXXFLAGS_NO= $(VISC_DLL) -D_DLL
|
||||
# But: if there are no objects LIBRARY_LD_OBJS to include
|
||||
# in this library (may be for e.g. base/src/libCompat
|
||||
# on some archs), don't define (and build) any library!
|
||||
SHRLIB_PREFIX=
|
||||
SHRLIB_SUFFIX=.dll
|
||||
SHRLIB_PREFIX =
|
||||
SHRLIB_SUFFIX_BASE = .dll
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
SHRLIBNAME_YES = $(BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
LOADABLE_SHRLIB_PREFIX=
|
||||
LOADABLE_SHRLIB_SUFFIX=.dll
|
||||
LOADABLE_SHRLIB_PREFIX =
|
||||
LOADABLE_SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
LOADABLE_SHRLIBNAME = $(LOADABLE_BUILD_LIBRARY:%=%$(LOADABLE_SHRLIB_SUFFIX))
|
||||
|
||||
#
|
||||
|
||||
@@ -36,11 +36,6 @@ ARCH_DEP_LDFLAGS += $(ARCH_DEP_FLAGS)
|
||||
#
|
||||
OP_SYS_CFLAGS += -fno-common
|
||||
|
||||
#
|
||||
# Don't try to use precompiled headers when converting sequencer files
|
||||
#
|
||||
CPPSNCFLAGS += -no-cpp-precomp
|
||||
|
||||
#
|
||||
# Darwin os definition
|
||||
#
|
||||
@@ -52,20 +47,6 @@ OP_SYS_CPPFLAGS += -Ddarwin
|
||||
OPT_CFLAGS_YES += -g
|
||||
OPT_CXXFLAGS_YES += -g
|
||||
|
||||
#
|
||||
# The following two definitions enable the use of DarwinPorts packages.
|
||||
#
|
||||
OP_SYS_INCLUDES += -I/opt/local/include
|
||||
# dir/firstword/wildcard used to avoid warning -L: directory name (...) does not exist
|
||||
OP_SYS_LDFLAGS += $(addprefix -L,$(dir $(firstword $(wildcard /opt/local/lib/*))))
|
||||
|
||||
#
|
||||
# The following two definitions enable the use of Fink packages.
|
||||
#
|
||||
OP_SYS_INCLUDES += -I/sw/include
|
||||
# dir/firstword/wildcard used to avoid warning -L: directory name (...) does not exist
|
||||
OP_SYS_LDFLAGS += $(addprefix -L,$(dir $(firstword $(wildcard /sw/lib/*))))
|
||||
|
||||
#
|
||||
# Libraries for command-line editing.
|
||||
#
|
||||
@@ -86,10 +67,11 @@ CCC = $(GNU_BIN)/c++
|
||||
#
|
||||
SHRLIB_VERSION = $(EPICS_VERSION).$(EPICS_REVISION).$(EPICS_MODIFICATION)
|
||||
SHRLIB_LDFLAGS = -dynamiclib -flat_namespace -undefined suppress \
|
||||
-install_name $(shell perl $(TOOLS)/fullPathName.pl $(INSTALL_LIB))/$@ \
|
||||
-install_name $(shell $(PERL) $(TOOLS)/fullPathName.pl $(INSTALL_LIB))/$@ \
|
||||
-compatibility_version $(EPICS_VERSION).$(EPICS_REVISION) \
|
||||
-current_version $(SHRLIB_VERSION)
|
||||
SHRLIB_SUFFIX = .$(SHRLIB_VERSION).dylib
|
||||
SHRLIB_SUFFIX_BASE = .dylib
|
||||
SHRLIB_SUFFIX = .$(SHRLIB_VERSION)$(SHRLIB_SUFFIX_BASE)
|
||||
|
||||
LOADABLE_SHRLIB_LDFLAGS = -bundle -flat_namespace -undefined suppress
|
||||
|
||||
|
||||
10
configure/os/CONFIG.linux-arm.Common
Normal file
10
configure/os/CONFIG.linux-arm.Common
Normal file
@@ -0,0 +1,10 @@
|
||||
# CONFIG.linux-arm.Common
|
||||
#
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Definitions for linux-arm host builds
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-arm.Common
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix hosts
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
10
configure/os/CONFIG.linux-arm.linux-arm
Normal file
10
configure/os/CONFIG.linux-arm.linux-arm
Normal file
@@ -0,0 +1,10 @@
|
||||
# CONFIG.linux-arm.linux-arm
|
||||
#
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Definitions for native linux-arm builds
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-arm.linux-arm
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include common gnu compiler definitions
|
||||
include $(CONFIG)/CONFIG.gnuCommon
|
||||
@@ -12,7 +12,7 @@ MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
NOP = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -176,7 +176,8 @@ LINK.shrlib+= $(DLL_DEF_FLAG),$(LIBRARY_LD_RESS)
|
||||
# But: if there are no objects LIBRARY_LD_OBJS to include
|
||||
# in this library (may be for e.g. base/src/libCompat
|
||||
# on some archs), don't define (and build) any library!
|
||||
SHRLIB_SUFFIX=.dll
|
||||
SHRLIB_SUFFIX_BASE = .dll
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
SHRLIBNAME_YES = $(BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
LOADABLE_SHRLIBNAME = $(LOADABLE_BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
NOP = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -12,7 +12,7 @@ MV = $(PERL) -MExtUtils::Command -e mv
|
||||
RM = $(PERL) -MExtUtils::Command -e rm_f
|
||||
MKDIR = $(PERL) -MExtUtils::Command -e mkpath
|
||||
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
|
||||
COMMENT = $(PERL) -e ''
|
||||
NOP = $(PERL) -e ''
|
||||
|
||||
WIND_HOST_TYPE = x86-win32
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -212,7 +212,8 @@ MUNCH_CMD = $(CCC) /Fo $@ $^
|
||||
# But: if there are no objects LIBRARY_LD_OBJS to include
|
||||
# in this library (may be for e.g. base/src/libCompat
|
||||
# on some archs), don't define (and build) any library!
|
||||
SHRLIB_SUFFIX=.dll
|
||||
SHRLIB_SUFFIX_BASE = .dll
|
||||
SHRLIB_SUFFIX = $(SHRLIB_SUFFIX_BASE)
|
||||
SHRLIBNAME_YES = $(BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
LOADABLE_SHRLIBNAME = $(LOADABLE_BUILD_LIBRARY:%=%$(SHRLIB_SUFFIX))
|
||||
|
||||
|
||||
@@ -5,21 +5,22 @@
|
||||
|
||||
# Where to find RTEMS
|
||||
#
|
||||
RTEMS_VERSION=4.9.2
|
||||
RTEMS_BASE=/usr/local/rtems/rtems-$(RTEMS_VERSION)
|
||||
RTEMS_VERSION = 4.10.2
|
||||
RTEMS_BASE = /usr/local/rtems/rtems-$(RTEMS_VERSION)
|
||||
|
||||
# Cross-compile toolchain in $(RTEMS_TOOLS)/bin
|
||||
#
|
||||
RTEMS_TOOLS=$(RTEMS_BASE)
|
||||
RTEMS_TOOLS = $(RTEMS_BASE)
|
||||
|
||||
|
||||
# If you're using neither BOOTP/DHCP nor FLASH to pick up your IOC
|
||||
# network configuration you must uncomment and specify your Internet
|
||||
# network configuration you must uncomment and specify your Internet
|
||||
# Domain Name here
|
||||
#
|
||||
#OP_SYS_CFLAGS += -DRTEMS_NETWORK_CONFIG_DNS_DOMAINNAME=<domainname>
|
||||
|
||||
#
|
||||
# Specify your desired command-line-input library
|
||||
# Select the command-line-input library to use
|
||||
#
|
||||
COMMANDLINE_LIBRARY = EPICS
|
||||
#COMMANDLINE_LIBRARY = LIBTECLA
|
||||
#COMMANDLINE_LIBRARY = READLINE
|
||||
|
||||
@@ -7,4 +7,7 @@
|
||||
|
||||
# If readline is installed uncomment the following line
|
||||
# to add command-line editing and history support
|
||||
COMMANDLINE_LIBRARY = READLINE
|
||||
#COMMANDLINE_LIBRARY = READLINE
|
||||
|
||||
# Uncomment the following line if readline has problems
|
||||
#LDLIBS_READLINE= -lreadline -lcurses
|
||||
|
||||
@@ -7,17 +7,31 @@
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Select which CPU architecture(s) to include in your MacOS binaries:
|
||||
# i386
|
||||
# x86_64 - Needs MacOS 10.4 with the Universal SDK, or 10.5 and later
|
||||
# i386, x86_64, or both (fat binaries).
|
||||
|
||||
ARCH_CLASS = i386
|
||||
#ARCH_CLASS = x86_64
|
||||
#ARCH_CLASS = i386
|
||||
ARCH_CLASS = x86_64
|
||||
#ARCH_CLASS = i386 x86_64
|
||||
|
||||
#
|
||||
# Uncomment the followings lines to build with CLANG instead of GCC.
|
||||
# Comment out the following 3 lines to build with Apple's GCC instead of CLANG.
|
||||
#
|
||||
#CC = clang
|
||||
#CCC = clang++
|
||||
#GNU_LDLIBS_YES =
|
||||
CC = clang
|
||||
CCC = clang++
|
||||
GNU = NO
|
||||
|
||||
|
||||
# To use MacPorts GCC, comment out ALL the settings above this line,
|
||||
# then uncomment (and modify if necessary) the following instead:
|
||||
|
||||
#GNU_DIR = /opt/local
|
||||
#CC = $(GNU_BIN)/gcc -m64
|
||||
#CCC = $(GNU_BIN)/g++ -m64
|
||||
|
||||
# If you see this or similar errors while building in the src/cap5 directory
|
||||
# gcc: error: unrecognized option '-no-cpp-precomp'
|
||||
# the problem is due to the ccflags configuration that your version of Perl
|
||||
# was built with. You can replace the Cap5_CFLAGS setting in the Makefile
|
||||
# with a hand-edited set of flags for building that Perl library, or ignore
|
||||
# this problem if you don't need to use Channel Access from Perl.
|
||||
|
||||
|
||||
26
configure/os/CONFIG_SITE.Common.ios-arm
Normal file
26
configure/os/CONFIG_SITE.Common.ios-arm
Normal file
@@ -0,0 +1,26 @@
|
||||
# CONFIG_SITE.Common.ios-arm
|
||||
#
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Site-specific settings for ios-arm target builds
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Which ARM instruction set(s) to generate code for:
|
||||
# Most iOS devices can run programs compiled for older
|
||||
# instruction sets, although the newer instructions are
|
||||
# more efficient.
|
||||
#
|
||||
# Apple's compilers can build for multiple architectures,
|
||||
# generating a Universal binary. This is larger and takes
|
||||
# longer to compile, but runs efficiently on all devices.
|
||||
#
|
||||
# Xcode 4.5 dropped support for the ARMv6.
|
||||
#
|
||||
# ARMv7s devices: iPhone 5
|
||||
# ARMv6 devices: iPhone 1 and 3G, iPod Touch Gen 1 and 2
|
||||
# All other devices are ARMv7
|
||||
|
||||
ARCH_CLASS = armv7 armv7s
|
||||
#ARCH_CLASS = armv7
|
||||
#ARCH_CLASS = armv6 armv7
|
||||
#ARCH_CLASS = armv6
|
||||
@@ -1,7 +1,6 @@
|
||||
# CONFIG_SITE.Common.iosCommon
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Site-specific settings for Apple iOS builds
|
||||
#-------------------------------------------------------
|
||||
@@ -10,16 +9,31 @@
|
||||
|
||||
#IOS_VERSION = 3.2
|
||||
#IOS_VERSION = 4.1
|
||||
IOS_VERSION = 4.3
|
||||
#IOS_VERSION = 4.2
|
||||
#IOS_VERSION = 4.3
|
||||
#IOS_VERSION = 5.0
|
||||
#IOS_VERSION = 5.1
|
||||
IOS_VERSION = 6.0
|
||||
|
||||
|
||||
# Most sites will want shared libraries
|
||||
# Which compiler to use:
|
||||
# CLANG is preferred for recent versions of Xcode
|
||||
# LLVM_GNU uses the llvm-gcc and llvm-g++ compilers
|
||||
# GNU is needed for older versions of Xcode
|
||||
|
||||
STATIC_BUILD=NO
|
||||
SHARED_LIBRARIES=YES
|
||||
COMPILER = CLANG
|
||||
#COMPILER = LLVM_GNU
|
||||
#COMPILER = GNU
|
||||
|
||||
|
||||
# Platform path, this is probably correct
|
||||
# Most sites will want to build shared libraries (which is the
|
||||
# default), but if you get an error from ld while building libCom,
|
||||
# try uncommenting this, which is needed for some compiler versions:
|
||||
|
||||
#SHARED_LIBRARIES = NO
|
||||
|
||||
|
||||
# Get platform path from OS, these are usually correct:
|
||||
|
||||
XCODE_PATH := $(shell xcode-select -print-path)
|
||||
PLATFORM_DIR = $(XCODE_PATH)/Platforms/$(IOS_PLATFORM).platform
|
||||
|
||||
14
configure/os/CONFIG_SITE.Common.linux-microblaze
Normal file
14
configure/os/CONFIG_SITE.Common.linux-microblaze
Normal file
@@ -0,0 +1,14 @@
|
||||
# CONFIG_SITE.Common.linux-microblaze
|
||||
#
|
||||
# Site specific definitions for linux-microblaze target builds.
|
||||
#-------------------------------------------------------
|
||||
|
||||
# The gnu tools for cross compiling for MicroBlaze (little endian)
|
||||
# on Linux can be downloaded from the Xilinx git server:
|
||||
# git clone git://git.xilinx.com/xldk/microblaze_v2.0_le.git
|
||||
#
|
||||
# The result contains a .tgz file with the tool-chain in it.
|
||||
# Set GNU_DIR to point to the un-tarred tool-chain:
|
||||
|
||||
GNU_DIR = /usr/local/vw/microblaze-2.0/microblazeel-unknown-linux-gnu
|
||||
|
||||
@@ -33,4 +33,8 @@ COMMANDLINE_LIBRARY = READLINE
|
||||
#COMMANDLINE_LIBRARY = READLINE_CURSES
|
||||
|
||||
|
||||
OP_SYS_CFLAGS += -g
|
||||
# It makes sense to include debugging symbols even in optimized builds
|
||||
# in case you want to attach gdb to the process or examine a core-dump.
|
||||
# This does cost disk space, but not memory as debug symbols are not
|
||||
# loaded into RAM when the binary is loaded.
|
||||
OPT_CFLAGS_YES += -g
|
||||
|
||||
@@ -33,4 +33,8 @@ COMMANDLINE_LIBRARY = READLINE
|
||||
#COMMANDLINE_LIBRARY = READLINE_CURSES
|
||||
|
||||
|
||||
OP_SYS_CFLAGS += -g
|
||||
# It makes sense to include debugging symbols even in optimized builds
|
||||
# in case you want to attach gdb to the process or examine a core-dump.
|
||||
# This does cost disk space, but not memory as debug symbols are not
|
||||
# loaded into RAM when the binary is loaded.
|
||||
OPT_CFLAGS_YES += -g
|
||||
|
||||
9
configure/os/CONFIG_SITE.Common.linux-xscale_be
Normal file
9
configure/os/CONFIG_SITE.Common.linux-xscale_be
Normal file
@@ -0,0 +1,9 @@
|
||||
# CONFIG_SITE.Common.linux-xscale_be
|
||||
#
|
||||
# Site specific definitions for linux-xscale_be target builds.
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Set GNU_DIR to point to directory containing the tool-chain
|
||||
|
||||
GNU_DIR = /usr/local/xscale_be
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
# Site override definitions for cygwin-x86 host builds
|
||||
#-------------------------------------------------------
|
||||
|
||||
CROSS_COMPILER_TARGET_ARCHS =
|
||||
#CROSS_COMPILER_TARGET_ARCHS =
|
||||
|
||||
|
||||
20
configure/os/CONFIG_SITE.darwinCommon.darwinCommon
Normal file
20
configure/os/CONFIG_SITE.darwinCommon.darwinCommon
Normal file
@@ -0,0 +1,20 @@
|
||||
# CONFIG_SITE.darwinCommon.darwinCommon
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Site specific definitions for darwin builds
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Uncomment the following two definitions to enable the use of DarwinPorts packages.
|
||||
#
|
||||
#OP_SYS_INCLUDES += -I/opt/local/include
|
||||
# dir/firstword/wildcard used to avoid warning -L: directory name (...) does not exist
|
||||
#OP_SYS_LDFLAGS += $(addprefix -L,$(dir $(firstword $(wildcard /opt/local/lib/*))))
|
||||
|
||||
# Uncomment the following two definitions to enable the use of Fink packages.
|
||||
#
|
||||
#OP_SYS_INCLUDES += -I/sw/include
|
||||
# dir/firstword/wildcard used to avoid warning -L: directory name (...) does not exist
|
||||
#OP_SYS_LDFLAGS += $(addprefix -L,$(dir $(firstword $(wildcard /sw/lib/*))))
|
||||
|
||||
7
configure/os/CONFIG_SITE.linux-arm.linux-arm
Normal file
7
configure/os/CONFIG_SITE.linux-arm.linux-arm
Normal file
@@ -0,0 +1,7 @@
|
||||
# CONFIG_SITE.linux-arm.linux-arm
|
||||
#
|
||||
# $Revision-Id$
|
||||
#
|
||||
# Site specific definitions for native linux-arm builds
|
||||
#-------------------------------------------------------
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
# Site specific definitions for linux-x86 host - linux-arm target builds
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Diamond:
|
||||
# Tools install path
|
||||
#GNU_DIR = /home/targetOS/linux-arm/host/x86-linux/gcc_3.3.3
|
||||
|
||||
# anj@aps:
|
||||
#GNU_DIR = /local/anj/cross-arm/gcc-3.4.5-glibc-2.3.6/arm-linux
|
||||
GNU_DIR = /net/phoebus/vw/zynq-2011.09
|
||||
|
||||
# GNU crosscompiler target name
|
||||
GNU_TARGET = arm-xilinx-linux-gnueabi
|
||||
|
||||
@@ -19,7 +19,7 @@ builds with release R3.14. It describes procedures such that:</p>
|
||||
<li>The application uses the configure rules which are new to R3.14.</li>
|
||||
<li>The OSI (Operating System Independent) features of R3.14 are available,
|
||||
i.e. iocCore products can be build for vxWorks as well as other
|
||||
platforms, e.g. solaris and linux.</li>
|
||||
platforms, e.g. Solaris and Linux.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Gnumake clean uninstall</h3>
|
||||
@@ -47,10 +47,14 @@ find *App iocBoot -print | cpio -pvmd <i>/path/to/new/top</i></pre>
|
||||
|
||||
<h3>Modify <i>top</i>/configure/RELEASE</h3>
|
||||
|
||||
<p>Copy definitions of external modules excluding EPICS_BASE and
|
||||
TEMPLATES_TOP from old application RELEASE file. <br>
|
||||
If sequence programs (*.st or *.stt files) exist in your application, add the
|
||||
SNCSEQ location definition for the R3.14 sncseq external module</p>
|
||||
<p>Copy definitions of external modules excluding <tt>EPICS_BASE</tt> and
|
||||
<tt>TEMPLATE_TOP</tt> from your old application config/RELEASE file. In many
|
||||
cases the modules you actually use under R3.14 will be different to the R3.13
|
||||
modules, but the old module names here give you a starting-point for what there
|
||||
replacements will be.</p>
|
||||
|
||||
<p>If any sequence programs (*.st or *.stt files) exist in your application, add
|
||||
the SNCSEQ location definition for the R3.14 sncseq external module.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>SNCSEQ = <i>/path/to/sncseq</i></pre>
|
||||
@@ -107,7 +111,7 @@ still to convert):</p>
|
||||
</blockquote>
|
||||
|
||||
<p>This new Makefile has comments explaining how to build the various host
|
||||
and ioc products. Lets consider some examples</p>
|
||||
and IOC products. Lets consider some examples</p>
|
||||
<ul>
|
||||
<li>Host programs
|
||||
<p>Makefile.Host contains definitions like:</p>
|
||||
@@ -149,7 +153,7 @@ DBDNAME = exampleApp.dbd</pre>
|
||||
<p>NOTES: Change exampleApp.dbd to example.dbd in all st.cmd files. Also
|
||||
this definition assumes that file exampleInclude.dbd exists.</p>
|
||||
</li>
|
||||
<li>Create the ioc application:
|
||||
<li>Create the IOC application:
|
||||
<p>Makefile.Vx contains statements like:</p>
|
||||
<blockquote>
|
||||
<pre>SRCS.c += ../xxxRecord.c
|
||||
@@ -198,21 +202,22 @@ baseLIBOBJS, Makefile.Host, and Makefile.Vx</p>
|
||||
</blockquote>
|
||||
|
||||
<p>to your <i>appname</i>Include.dbd file and remove the file
|
||||
<i>name</i>App/src/base.dbd from your src directory. The base.dbd from base/dbd
|
||||
will be used instead. If you only want to load a subset of the record
|
||||
definitions from base you can keep your own copy of base.dbd, but you should
|
||||
copy the one from your R3.14 base and edit that rather than trying to re-use the
|
||||
R3.13 version from your old application.</p>
|
||||
<i>name</i>App/src/base.dbd from your src directory. The base.dbd file from
|
||||
$(EPICS_BASE)/dbd will be used instead. If you only want to load a subset of the
|
||||
record definitions from base you can keep a local edited copy of the base.dbd
|
||||
file but you should copy it from $(EPICS_BASE)/dbd and edit that rather than
|
||||
trying to re-use the R3.13 version from your old application area.</p>
|
||||
|
||||
<h3>Record support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The structure rset is now a typedef so change</p>
|
||||
<p>The <tt>struct rset</tt> is now available as a typedef so change</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>struct rset <i>recordname</i>RSET = { ... };</pre>
|
||||
@@ -224,65 +229,68 @@ R3.13 version from your old application.</p>
|
||||
<pre>rset <i>recordname</i>RSET = { ... };</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the <q>rset <i>recordname</i>RSET = { ...
|
||||
};</q> definition.</p>
|
||||
<p>and add the following line immediately after that definition:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(rset,<i>recordname</i>RSET);</pre>
|
||||
<pre>epicsExportAddress(rset, <i>recordname</i>RSET);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Device support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the dset definition <q>struct { ... }
|
||||
dev<i>name</i> = { ... };</q></p>
|
||||
<p>and add the following line after every dset definition <tt>struct { ... }
|
||||
dev<i>name</i> = { ... };</tt> in the file.</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(dset,dev<i>name</i>);</pre>
|
||||
<pre>epicsExportAddress(dset, dev<i>name</i>);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Driver support</h3>
|
||||
|
||||
<p>Add the following line after all existing #includes</p>
|
||||
<p>Add the following header file inclusion after all other <tt>#include</tt>
|
||||
statements:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>and add the following line after the drvet drv<i>name</i> definition</p>
|
||||
<p>and add the following line after the <tt>drvet drv<i>name</i></tt>
|
||||
definition:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(drvet,drv<i>name</i>);</pre>
|
||||
<pre>epicsExportAddress(drvet, drv<i>name</i>);</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>Registration code changed</h3>
|
||||
|
||||
<p>Registration code for application specific functions, e.g. subroutine record
|
||||
init and process functions, must be changed as follows</p>
|
||||
init and process functions, must be changed as follows</p>
|
||||
|
||||
<ol>
|
||||
<li>Include the following header files after all existing #includes:
|
||||
<li>Add the following header file inclusions after all other <tt>#include</tt>
|
||||
statements:
|
||||
<blockquote>
|
||||
<pre>#include "registryFunction.h"
|
||||
#include "epicsExport.h"</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Make the application specific functions static functions, e.g.
|
||||
<li>Mark the application specific functions as <tt>static</tt>, e.g.
|
||||
<blockquote>
|
||||
<pre>static long mySubInit(subRecord *precord)
|
||||
static long mySubProcess(subRecord *precord)</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Add an epicsExportFunction statement for each of the functions to be
|
||||
registered, e.g.
|
||||
<li>Add an <tt>epicsRegisterFunction</tt> statement for each of the functions
|
||||
to be registered, e.g.
|
||||
<blockquote>
|
||||
<pre>epicsExportFunction(mySubInit);
|
||||
epicsExportFunction(mySubProcess);</pre>
|
||||
<pre>epicsRegisterFunction(mySubInit);
|
||||
epicsRegisterFunction(mySubProcess);</pre>
|
||||
</blockquote></li>
|
||||
|
||||
<li>Add a function statement for each of the functions to be registered in a
|
||||
@@ -293,6 +301,21 @@ function("mySubProcess")</pre>
|
||||
</blockquote></li>
|
||||
</ol>
|
||||
|
||||
<h3>Additional Headers</h3>
|
||||
|
||||
<p>It may be necessary to add one or more of the following header file
|
||||
inclusions to any C source file if you get warnings or errors from the
|
||||
compilation process. The most likely file missing is errlog.h.</p>
|
||||
|
||||
<ul>
|
||||
<li><tt>#include <stdarg.h></tt></li>
|
||||
<li><tt>#include "errlog.h"</tt></li>
|
||||
<li><tt>#include "errMdef.h"</tt></li>
|
||||
<li><tt>#include "ellLib.h"</tt></li>
|
||||
<li><tt>#include "epicsTypes.h"</tt></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Modify the Makefiles in <i>top</i>/iocBoot directory.</h3>
|
||||
|
||||
<p>Change <q><tt>include $(TOP)/config/CONFIG_APP</tt></q> to <q><tt>include
|
||||
@@ -351,14 +374,13 @@ $(TOP)/configure/RULES.ioc</tt></q></p>
|
||||
ld < iocCore</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Change <q><tt>ld < <i>name</i>Lib</tt></q> to
|
||||
<p>The <tt>ld</tt> command in vxWorks 5.5.2 doesn't clean up its standard input
|
||||
stream properly, so we now recommend passing the filename to it as an argument
|
||||
instead. Change <q><tt>ld < <i>name</i>Lib</tt></q> to
|
||||
|
||||
<blockquote>
|
||||
<pre>ld 0,0, "<i>name</i>.munch"</pre>
|
||||
|
||||
<p>(The <tt>ld</tt> command in vxWorks 5.5.2 doesn't clean up its standard
|
||||
input properly, so we now recommend passing the filename to it directly
|
||||
instead.)</p> </blockquote>
|
||||
</blockquote>
|
||||
|
||||
<p>Change <q><tt>cd appbin</tt></q> to <q><tt>cd topbin</tt></q></p>
|
||||
|
||||
@@ -381,58 +403,42 @@ to
|
||||
|
||||
<p>If any source file makes calls to recGbl routines make sure it includes
|
||||
<tt>recGbl.h</tt>. If it doesn't the compiler will issue warning messages and
|
||||
the ioc may issue the message: <q>undefined symbol: _recGblSetSevr</q>.</p>
|
||||
the IOC may not compile properly, or on vxWorks you could see the load-time
|
||||
error: <q>undefined symbol: _recGblSetSevr</q>.</p>
|
||||
|
||||
<h3>Record support changes</h3>
|
||||
|
||||
<p>The steppermotor, scan, and pid records are no longer in base. If these
|
||||
records are not used in your application, comment out references to them in
|
||||
base.dbd. If these record types are used at your site, they should be
|
||||
downloaded and built with base R3.14 by your EPICS administrator. To update
|
||||
the R3.14 location of these record types in your application you must add
|
||||
appropriate module definitions to your application's config/RELEASE file and
|
||||
add <tt>LIBOBJS</tt> definitions to the src Makefile.</p>
|
||||
<p>The steppermotor, scan, and pid records are no longer in base. If these
|
||||
record types are used at your site, their unbundled modules should be downloaded
|
||||
from the EPICS website and built with base R3.14 by your EPICS administrator. To
|
||||
use these record types in your application you must add them to the application
|
||||
just like any other external support module. Most modules provide instructions
|
||||
on how to use them in an IOC application.</p>
|
||||
|
||||
<p>For example add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>PID = <i>/path/to/modules</i>/pid</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to config/RELEASE and add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>LIBOBJS += $(PID_BIN)/pidRecord.o</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to your application src/Makefile.</p>
|
||||
|
||||
<p>You should consider changing any existing old steppermotor records to the
|
||||
new EPICS motor record module supported by Beamline Controls and Data
|
||||
Acquisition at APS.</p>
|
||||
<p>Consider changing any existing old steppermotor records to the EPICS motor
|
||||
record module supported by the Beamline Controls and Data Acquisition group at
|
||||
APS.</p>
|
||||
|
||||
<h3>RecDynLink.o and devPtSoft changes</h3>
|
||||
|
||||
<p>recDynLink.o and devPtSoft.o are no longer in EPICS base and now exist as
|
||||
separate EPICS modules.You must now add the appropriate module full path
|
||||
definitions to your application config/RELEASE file, and change
|
||||
<tt>LIBOBJS</tt> location definition <tt>$(EPICS_BASE_BIN)</tt> to the module
|
||||
definition bin directory in your application src directory files. See
|
||||
<q>Hardware support changes</q> below for instructions.</p>
|
||||
separate unbundled EPICS modules. As with the three record types described
|
||||
above these must now be built separately and added as support modules to any
|
||||
applications that need them.</p>
|
||||
|
||||
<h3>Hardware support changes</h3>
|
||||
|
||||
<p>All hardware support (dev, drv and dbd files) except soft support has been
|
||||
unbundled from base R3.14. This support includes the files symb.dbd,
|
||||
drvHp1404a.o, drvEpvxiMsg.o, and drvEpvxi.o. If these are not used by your
|
||||
application, comment out references to them in base.dbd.</p>
|
||||
application, remove any references to them from your dbd files.</p>
|
||||
|
||||
<p>Hardware support now exists as separate EPICS modules. The hardware
|
||||
support for your site should be downloaded and built with base R3.14 by your
|
||||
EPICS administrator. You must now add the appropriate module full path
|
||||
definitions to your application config/RELEASE file, and change
|
||||
<tt>LIBOBJS</tt> location from <tt>$(EPICS_BASE_BIN) </tt>to the module bin
|
||||
directory in your application src directory files.</p>
|
||||
<p>Hardware support now exists as separate EPICS modules. The hardware support
|
||||
modules used at your site should be downloaded and built with base R3.14 by your
|
||||
EPICS administrator. To use them, add the appropriate module full path
|
||||
definitions to your application configure/RELEASE file, and make the documented
|
||||
changes to your Makefile to link their binaries into the your IOC
|
||||
executable.</p>
|
||||
|
||||
<p>For example, remove</p>
|
||||
|
||||
@@ -440,7 +446,7 @@ directory in your application src directory files.</p>
|
||||
<pre>LIBOBJS += $(EPICS_BASE_BIN)/symb</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>from baseLIBOBJS and add</p>
|
||||
<p>from <tt>baseLIBOBJS</tt> and add</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>LIBOBJS += $(SYMB_BIN)/symb</pre>
|
||||
@@ -452,25 +458,25 @@ directory in your application src directory files.</p>
|
||||
<pre>SYMB = <full path definition for the built module SYMB></pre>
|
||||
</blockquote>
|
||||
|
||||
<p>into your application config/RELEASE file.</p>
|
||||
<p>into your application configure/RELEASE file.</p>
|
||||
|
||||
<h3>dbLoadtemplate tool changes</h3>
|
||||
|
||||
<p>The host tool dbLoadTemplate has been replace by a new EPICS extension,
|
||||
<p>The host tool dbLoadTemplate has been replace by a new EPICS extension called
|
||||
msi, which should be downloaded and built with base R3.14 by your EPICS
|
||||
administrator. dbLoadTemplate is still supported on iocs. If, in your
|
||||
application, db files are created from template and substitution files you
|
||||
should add the definition</p>
|
||||
administrator. dbLoadTemplate is still supported on IOCs. If the msi executable
|
||||
is not in your default search path and in your application db files are created
|
||||
from template and substitution files, you should add the definition</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>MSI = <full path name to msi executable></pre>
|
||||
</blockquote>
|
||||
|
||||
<p>to your application config/RELEASE file.</p>
|
||||
</body>
|
||||
<p>to your application's configure/RELEASE file.</p>
|
||||
|
||||
<h3>Optional <i>top</i>/configure/CONFIG_SITE changes.</h3>
|
||||
<h3>Optional <i>top</i>/configure/CONFIG_SITE changes</h3>
|
||||
|
||||
<p>Review and optionally modify site build settings.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,16 +3,203 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
|
||||
<title>EPICS Base R3.14.12.2-rc1 Release Notes</title>
|
||||
<title>EPICS Base R3.14.12.3 Release Notes</title>
|
||||
</head>
|
||||
|
||||
<body lang="en">
|
||||
<h1 align="center">EPICS Base Release 3.14.12.2-rc1</h1>
|
||||
<h1 align="center">EPICS Base Release 3.14.12.3</h1>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2-rc1</h2>
|
||||
<h2 align="center">Changes between 3.14.12.2 and 3.14.12.3</h2>
|
||||
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h4>Hex literals in CALC expressions</h4>
|
||||
|
||||
<p>In previous releases, CALC expressions could contain hexadecimal literal
|
||||
integers on a target if the OS implementation of strtod() allows them (the
|
||||
vxWorks implementation does not). Now hex literal integers can be used in CALC
|
||||
expressions on all architectures. Hexadecimal floating point literals may have
|
||||
worked on some architectures in the past, but will no longer be accepted.</p>
|
||||
|
||||
<h4>CAS: Added propertyEventMask support</h4>
|
||||
|
||||
<p>Server tools should now be able to detect subscriptions to and send updates
|
||||
for DBE_PROPERTY events, using a casEventMask value returned by the new
|
||||
caServer::propertyEventMask() method.</p>
|
||||
|
||||
<h4>caRepeater now built by default</h4>
|
||||
|
||||
<p>Previously caRepeater was only built for host architectures, so builds for
|
||||
cross-compiled but workstation-type targets like linux-arm did not build it.
|
||||
Explicit exceptions prevent it being built on architectures like vxWorks, RTEMS
|
||||
and iOS which do not support normal executable programs.</p>
|
||||
|
||||
<h4>Array Subroutine (aSub) record type fixes</h4>
|
||||
|
||||
<ul>
|
||||
<li>Changing the number of valid elements in a VALx field now triggers
|
||||
monitors</li>
|
||||
<li>The NEVx fields now post monitors, following the EFLG setting</li>
|
||||
<li>The artificial limit of 10,000,000 array elements has been removed</li>
|
||||
</ul>
|
||||
|
||||
<h4>Problem with NAN values in MLST/ALST fields</h4>
|
||||
|
||||
<p>The ai, ao, calc, calcout, dfanout, sel and sub record types could stop
|
||||
posting monitors if they got NAN values in their MLST or ALST fields. A change
|
||||
has been included so this should no longer be the case.</p>
|
||||
|
||||
<h4>MacOS build defaults changed</h4>
|
||||
|
||||
<p>The default build settings for darwin-x86 targets have been changed to match
|
||||
the latest version of XCode; see configure/os/CONFIG_SITE.Common.darwin-x86
|
||||
if you need to revert back to building with GCC or to include the i386 CPU
|
||||
architecture.</p>
|
||||
|
||||
<h4>Build problem with db dependencies</h4>
|
||||
|
||||
<p>The dependency output for .db and .acf files created by makeDbDepends.pl did
|
||||
not show the directories of the depended files. The makeDbDepends.pl script has
|
||||
been replaced by mkmf.pl for this purpose after modifying it to accept multiple
|
||||
-I include directory options and more than one source file on the command line.
|
||||
The makeDbDepends.pl script has been removed from Base.</p>
|
||||
|
||||
<h4>Native linux-arm builds added</h4>
|
||||
|
||||
<p>The configuration files needed for a linux-arm system to build Base for
|
||||
itself have now been added. Both the Shell and Perl versions of the startup
|
||||
EpicsHostArch scripts now recognize both arm6l and arm7l CPUs and return the
|
||||
generic linux-arm host architecture name for them.</p>
|
||||
|
||||
<h4>New Microblaze Target Architecture</h4>
|
||||
|
||||
<p>A new cross-compiled target architecture is included for the Xilinx
|
||||
Microblaze FPGA soft-core CPU architecture running Linux.</p>
|
||||
|
||||
<h4>Win32 Numeric string to enum/menu/device conversions</h4>
|
||||
|
||||
<p>Microsoft's C run-time library has a bug in the sscanf() function such that
|
||||
the "%n" format specifier does not always work. The string to enum, menu and
|
||||
device conversion functions have been modified to avoid this problem, but a
|
||||
numeric string will no longer be converted properly on any architecture if it
|
||||
has trailing whitespace characters.</p>
|
||||
|
||||
<h4>Launchpad Bugs Resolved</h4>
|
||||
|
||||
<p>The following are links to bugs in the Launchpad bug tracker that have been
|
||||
fixed in this release:</p>
|
||||
|
||||
<ul>
|
||||
<li>1090009
|
||||
<a href="https://bugs.launchpad.net/bugs/1090009">
|
||||
osdSufficentSpaceInPoolQuery fails on vxWorks 2 GB system</a></li>
|
||||
<li>999167
|
||||
<a href="https://launchpad.net/bugs/999167">
|
||||
Missing epicsShareFunc for casStatsFetch</a></li>
|
||||
<li>950555
|
||||
<a href="https://launchpad.net/bugs/950555">
|
||||
String substitution removes part of path when linking versioned shared
|
||||
libraries</a></li>
|
||||
<li>907761
|
||||
<a href="https://launchpad.net/bugs/907761">
|
||||
reading only 1st char of link in "long string" ($) syntax fails in read
|
||||
error</a></li>
|
||||
<li>903448
|
||||
<a href="https://launchpad.net/bugs/903448">
|
||||
RHEL5 nss ldap update cause stack size related failure</a>
|
||||
<p>
|
||||
This bug fix changed the stack sizes for both Posix and Windows targets as
|
||||
follows:</p>
|
||||
<table>
|
||||
<tr><th>epicsThreadStackSizeClass</th><th>New Stack Size</th></tr>
|
||||
<tr><td>epicsThreadStackSmall</td>
|
||||
<td>0x10000 × sizeof (void *)</td></tr>
|
||||
<tr><td>epicsThreadStackMedium</td>
|
||||
<td>0x20000 × sizeof (void *)</td></tr>
|
||||
<tr><td>epicsThreadStackBig</td>
|
||||
<td>0x40000 × sizeof (void *)</td></tr>
|
||||
</table></li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h4>Calcout and Seq record timestamps</h4>
|
||||
|
||||
<p>Both the calcout and seq record types were not updating the record's
|
||||
timestamp before calling db_post_events() for some field updates. The calcout
|
||||
record type will now update the record's timestamp before it posts a channel
|
||||
access monitor on the DLYA field; this happens twice during record processing if
|
||||
the ODLY field is larger than 0.</p>
|
||||
|
||||
<p>Timestamps from all seq record monitor events have been wrong since 1995 or
|
||||
earlier, the time being provided was from the last time the record processed.
|
||||
Now the record timestamp will be updated between reading each DOL1..DOLA link
|
||||
and posting the monitor on the associated DO1..DOA field. The VAL field is
|
||||
never given a value by the record processing code, but is used for posting
|
||||
monitors when the alarm status or severity gets updated at the end of record
|
||||
processing. Alarm monitors are now timestamped properly at that time.</p>
|
||||
|
||||
<h4>Comments in iocsh scripts</h4>
|
||||
|
||||
<p>The IOC shell was very particular about comments in previous versions of
|
||||
Base. If the <tt>#</tt> character was indented using white-space characters it
|
||||
had to be followed immediately by a white-space, comma or parenthesis character,
|
||||
and macLib would report errors if the rest of the comment contained any
|
||||
undefined macros. These restrictions have now been removed. The comment
|
||||
character can come from expanding a macro without it having to be followed by
|
||||
white-space, although in this case macLib will still report errors due to
|
||||
undefined or circular macro definitions.</p>
|
||||
|
||||
<h4>MacOS-X: Don't use Ports/Fink unless configured</h4>
|
||||
|
||||
<p>Previous releases would automatically use headers and link to libraries found
|
||||
in the DarwinPorts and Fink installation directories. This is now controlled by
|
||||
entries in the <tt>CONFIG_SITE.darwinCommon.darwinCommon</tt> file in the
|
||||
<tt>configure/os</tt> directory, which are commented out by default. Recent
|
||||
versions of MacOS-X come with an implementation of readline, so those additional
|
||||
code repositories are no longer required.</p>
|
||||
|
||||
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2</h2>
|
||||
|
||||
<h4>Path for Cap5 loadable library changed</h4>
|
||||
|
||||
<p>The perl CA module makes use of a loadable library, which used to be loaded
|
||||
from the base/lib/<host-arch> directory. However different versions of
|
||||
Perl require different loadable library binaries as the Perl ABI can change.
|
||||
Now the library will be installed into and loaded from the directory
|
||||
base/lib/perl/<version>/<archname> where both <version> and
|
||||
<archname> are taken from the Perl configuration. This makes it possible
|
||||
for the same Perl script to be run on both RHEL5 and RHEL6 workstations say, even
|
||||
though they use different versions of Perl.</p>
|
||||
|
||||
<p>To achieve that, first build EPICS Base using the older OS version. Then
|
||||
on a machine running the newer version, go into the base/src/cap5 directory and
|
||||
run a <tt>make rebuild</tt> command. This will rebuild the libCap5.so file and
|
||||
install it into the location appropriate for its Perl version and architecture.</p>
|
||||
|
||||
<h4>Build configurations updated for Apple iOS targets</h4>
|
||||
|
||||
<p>The build process can now construct universal binaries containing both ARMv6
|
||||
and ARMv7 code, and several defaults have been changed when building for iOS
|
||||
targets:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li>The default value for IOS_VERSION is now 5.0, edit the setting in
|
||||
<tt>configure/os/CONFIG_SITE.Common.iosCommon</tt> to use an older version.</li>
|
||||
|
||||
<li>With the introduction of iOS 5.0 we have switched the C++ compiler for
|
||||
ios-arm from GNU g++ to using the LLVM-based clang++ (the GNU compilers are
|
||||
apparetnly no longer included with the SDK). This can be switched back by
|
||||
editing the new <tt>CONFIG_SITE.Common.ios-arm</tt> file.</li>
|
||||
|
||||
<li>Like the Darwin builds, universal binaries can now be compiled for the
|
||||
ios-arm target, containing either or both ARMv6 and ARMv7 instructions. This is
|
||||
configured by setting ARCH_CLASS in the new <tt>CONFIG_SITE.Common.ios-arm</tt>
|
||||
file. The default is now to build for ARMv7 only, which is not compatible with
|
||||
the original iPhone 1 or 3G, or with the iPod Touch Generations 1 or 2.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h4>Added <tt>-b</tt> option to dbExpand</h4>
|
||||
|
||||
<p>This turns off monotonic checking of breakpoint tables.</p>
|
||||
|
||||
@@ -173,7 +173,7 @@ initialize_local_filesystem(char **argv)
|
||||
#if __RTEMS_MAJOR__>4 || \
|
||||
(__RTEMS_MAJOR__==4 && __RTEMS_MINOR__>9) || \
|
||||
(__RTEMS_MAJOR__==4 && __RTEMS_MINOR__==9 && __RTEMS_REVISION__==99)
|
||||
static int
|
||||
int
|
||||
nfsMount(char *uidhost, char *path, char *mntpoint)
|
||||
{
|
||||
int devl = strlen(uidhost) + strlen(path) + 2;
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/* share/src/as/asDbLib.c */
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* Copyright (c) 2012 UChicago Argonne LLC, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* Author: Marty Kraimer Date: 02-11-94*/
|
||||
@@ -69,18 +67,23 @@ static long asDbAddRecords(void)
|
||||
|
||||
int epicsShareAPI asSetFilename(const char *acf)
|
||||
{
|
||||
if(pacf) free ((void *)pacf);
|
||||
if(acf) {
|
||||
pacf = calloc(1,strlen(acf)+1);
|
||||
if(!pacf) {
|
||||
errMessage(0,"asSetFilename calloc failure");
|
||||
} else {
|
||||
strcpy(pacf,acf);
|
||||
}
|
||||
if (pacf)
|
||||
free (pacf);
|
||||
if (acf) {
|
||||
pacf = calloc(1, strlen(acf)+1);
|
||||
if (!pacf) {
|
||||
errMessage(0, "asSetFilename calloc failure");
|
||||
} else {
|
||||
strcpy(pacf, acf);
|
||||
if (*pacf != '/' && !strchr(pacf, ':')) {
|
||||
printf("asSetFilename: Warning - relative paths won't usually "
|
||||
"work\n");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
pacf = NULL;
|
||||
pacf = NULL;
|
||||
}
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int epicsShareAPI asSetSubstitutions(const char *substitutions)
|
||||
|
||||
@@ -455,7 +455,7 @@ Environment</a> below.</p>
|
||||
<h3><a name="firewall">Firewalls</a></h3>
|
||||
|
||||
<p>If you want channel access clients on a machine to be able to see
|
||||
beacons and replies to broadcast PV search requests you need to permit
|
||||
beacons and replies to broadcast PV search requests, you need to permit
|
||||
inbound UDP packets with source port EPICS_CA_SERVER_PORT (default is 5064)
|
||||
or destination port EPICS_CA_REPEATER_PORT (default is 5065). On systems
|
||||
using iptables this can be accomplished by rules like</p>
|
||||
@@ -466,9 +466,9 @@ using iptables this can be accomplished by rules like</p>
|
||||
</pre>
|
||||
|
||||
<p>If you want channel access servers (e.g. "soft IOCs") on a machine to be
|
||||
able to see clients you need to permit inbound TCP or UDP packets with source
|
||||
port EPICS_CA_SERVER_PORT (default is 5064). On systems using iptables this
|
||||
can be accomplished by rules like</p>
|
||||
able to be seen by clients, you need to permit inbound TCP or UDP packets with
|
||||
destination port EPICS_CA_SERVER_PORT (default is 5064).
|
||||
On systems using iptables this can be accomplished by rules like</p>
|
||||
|
||||
<pre>
|
||||
-A INPUT -s 192.168.0.0/22 -p udp --dport 5064 -j ACCEPT
|
||||
|
||||
@@ -91,14 +91,19 @@ PROD_LIBS = ca Com
|
||||
# needed when its an object library build
|
||||
PROD_SYS_LIBS_WIN32 = ws2_32 advapi32 user32
|
||||
|
||||
PROD_HOST += caRepeater catime acctst caConnTest casw caEventRate
|
||||
OBJS_IOC += catime acctst caConnTest casw caEventRate acctstRegister
|
||||
PROD_DEFAULT += caRepeater catime acctst caConnTest casw caEventRate
|
||||
PROD_vxWorks = -nil-
|
||||
PROD_RTEMS = -nil-
|
||||
PROD_iOS = -nil-
|
||||
|
||||
OBJS_vxWorks = catime acctst caConnTest casw caEventRate acctstRegister
|
||||
|
||||
caRepeater_SRCS = caRepeater.cpp
|
||||
catime_SRCS = catimeMain.c catime.c
|
||||
acctst_SRCS = acctstMain.c acctst.c
|
||||
catime_SRCS = catimeMain.c catime.c
|
||||
acctst_SRCS = acctstMain.c acctst.c
|
||||
caEventRate_SRCS = caEventRateMain.cpp caEventRate.cpp
|
||||
casw_SRCS = casw.cpp
|
||||
caConnTest_SRCS = caConnTestMain.cpp caConnTest.cpp
|
||||
caConnTest_SRCS = caConnTestMain.cpp caConnTest.cpp
|
||||
|
||||
casw_SYS_LIBS_solaris = socket
|
||||
|
||||
|
||||
@@ -397,6 +397,11 @@ void udpRecvThread::run ()
|
||||
} while ( ! this->iiu.shutdownCmd );
|
||||
}
|
||||
|
||||
/* for sunpro compiler */
|
||||
udpiiu::M_repeaterTimerNotify::~M_repeaterTimerNotify ()
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* udpiiu::M_repeaterTimerNotify::repeaterRegistrationMessage ()
|
||||
*
|
||||
|
||||
@@ -143,6 +143,7 @@ private:
|
||||
public:
|
||||
M_repeaterTimerNotify ( udpiiu & iiu ) :
|
||||
m_udpiiu ( iiu ) {}
|
||||
~M_repeaterTimerNotify (); /* for sunpro compiler */
|
||||
// repeaterTimerNotify
|
||||
void repeaterRegistrationMessage (
|
||||
unsigned attemptNumber );
|
||||
|
||||
@@ -6,9 +6,6 @@ use warnings;
|
||||
|
||||
my $version = '0.4';
|
||||
|
||||
exists $ENV{EPICS_HOST_ARCH}
|
||||
or die "EPICS_HOST_ARCH environment variable not set";
|
||||
|
||||
|
||||
package CA;
|
||||
|
||||
@@ -26,12 +23,17 @@ package Cap5;
|
||||
our $VERSION = $version;
|
||||
our @ISA = qw(DynaLoader);
|
||||
|
||||
# Library is specific to the Perl version and archname
|
||||
use Config;
|
||||
my $perl_version = $Config::Config{version};
|
||||
my $perl_archname = $Config::Config{archname};
|
||||
|
||||
require DynaLoader;
|
||||
|
||||
# Add our lib/<arch> directory to the shared library search path
|
||||
use File::Basename;
|
||||
my $Lib = dirname(__FILE__);
|
||||
push @DynaLoader::dl_library_path, "$Lib/../$ENV{EPICS_HOST_ARCH}";
|
||||
push @DynaLoader::dl_library_path, "$Lib/$perl_version/$perl_archname";
|
||||
|
||||
bootstrap Cap5 $VERSION;
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ ifneq ($(findstring darwin,$(T_A)),)
|
||||
LOADABLE_SHRLIB_SUFFIX = .bundle
|
||||
endif
|
||||
|
||||
PERL_VERSION = $(shell $(PERL) ../perlConfig.pl version)
|
||||
PERL_ARCHNAME = $(shell $(PERL) ../perlConfig.pl archname)
|
||||
PERL_ARCHPATH = $(PERL_VERSION)/$(PERL_ARCHNAME)
|
||||
|
||||
ifeq ($(findstring Host,$(VALID_BUILDS)),Host)
|
||||
ifeq ($(findstring $(OS_CLASS),WIN32 cygwin32),)
|
||||
# Doesn't build on WIN32
|
||||
LOADABLE_LIBRARY_HOST = Cap5
|
||||
@@ -33,12 +38,11 @@ ifeq ($(findstring $(OS_CLASS),WIN32 cygwin32),)
|
||||
PERL_SCRIPTS += camonitor.pl
|
||||
|
||||
PERL_MODULES += CA.pm
|
||||
PERL_MODULES += $(PERL_ARCHPATH)/$(LOADABLE_SHRLIB_PREFIX)Cap5$(LOADABLE_SHRLIB_SUFFIX)
|
||||
|
||||
ifeq ($(findstring Host,$(VALID_BUILDS)),Host)
|
||||
# Can only create docs in Host build
|
||||
HTMLS_DIR = .
|
||||
HTMLS = CA.html
|
||||
endif
|
||||
HTMLS_DIR = .
|
||||
HTMLS = CA.html
|
||||
endif
|
||||
endif
|
||||
|
||||
Cap5_SRCS = Cap5.xs
|
||||
@@ -59,6 +63,10 @@ ifdef T_A
|
||||
$(RM) $@
|
||||
podchecker $< && pod2html --infile=$< --outfile=$@
|
||||
|
||||
$(INSTALL_PERL_MODULES)/$(PERL_ARCHPATH)/%: %
|
||||
$(ECHO) "Installing loadable shared library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m $(LIB_PERMISSIONS) $< $(INSTALL_PERL_MODULES)/$(PERL_ARCHPATH)
|
||||
|
||||
clean::
|
||||
$(RM) Cap5.c
|
||||
endif
|
||||
|
||||
@@ -3,9 +3,8 @@
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
* $Revision-Id$
|
||||
@@ -15,8 +14,8 @@
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#include "dbMapper.h" // ait to dbr types
|
||||
#include "gddAppTable.h" // EPICS application type table
|
||||
#include "dbMapper.h" // ait to dbr types
|
||||
#include "gddAppTable.h" // EPICS application type table
|
||||
#include "fdManager.h"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
@@ -37,67 +36,67 @@ caServer::caServer ()
|
||||
|
||||
caServer::~caServer()
|
||||
{
|
||||
if (this->pCAS) {
|
||||
delete this->pCAS;
|
||||
if (this->pCAS) {
|
||||
delete this->pCAS;
|
||||
this->pCAS = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pvExistReturn caServer::pvExistTest ( const casCtx & ctx,
|
||||
const caNetAddr & /* clientAddress */, const char * pPVAliasName )
|
||||
const caNetAddr & /* clientAddress */, const char * pPVAliasName )
|
||||
{
|
||||
return this->pvExistTest ( ctx, pPVAliasName );
|
||||
}
|
||||
|
||||
pvExistReturn caServer::pvExistTest ( const casCtx &, const char * )
|
||||
{
|
||||
return pverDoesNotExistHere;
|
||||
return pverDoesNotExistHere;
|
||||
}
|
||||
|
||||
pvCreateReturn caServer::createPV ( const casCtx &, const char * )
|
||||
{
|
||||
return S_casApp_pvNotFound;
|
||||
return S_casApp_pvNotFound;
|
||||
}
|
||||
|
||||
pvAttachReturn caServer::pvAttach ( const casCtx &ctx, const char *pAliasName )
|
||||
{
|
||||
// remain backwards compatible (call deprecated routine)
|
||||
return this->createPV ( ctx, pAliasName );
|
||||
// remain backwards compatible (call deprecated routine)
|
||||
return this->createPV ( ctx, pAliasName );
|
||||
}
|
||||
|
||||
casEventMask caServer::registerEvent (const char *pName) // X aCC 361
|
||||
casEventMask caServer::registerEvent (const char *pName)
|
||||
{
|
||||
if (this->pCAS) {
|
||||
return this->pCAS->registerEvent(pName);
|
||||
}
|
||||
else {
|
||||
casEventMask emptyMask;
|
||||
printf("caServer:: no server internals attached\n");
|
||||
return emptyMask;
|
||||
}
|
||||
if (this->pCAS) {
|
||||
return this->pCAS->registerEvent(pName);
|
||||
}
|
||||
else {
|
||||
casEventMask emptyMask;
|
||||
printf("caServer:: no server internals attached\n");
|
||||
return emptyMask;
|
||||
}
|
||||
}
|
||||
|
||||
void caServer::show(unsigned level) const
|
||||
{
|
||||
if (this->pCAS) {
|
||||
this->pCAS->show(level);
|
||||
}
|
||||
else {
|
||||
printf("caServer:: no server internals attached\n");
|
||||
}
|
||||
if (this->pCAS) {
|
||||
this->pCAS->show(level);
|
||||
}
|
||||
else {
|
||||
printf("caServer:: no server internals attached\n");
|
||||
}
|
||||
}
|
||||
|
||||
void caServer::setDebugLevel (unsigned level)
|
||||
{
|
||||
if (pCAS) {
|
||||
this->pCAS->setDebugLevel(level);
|
||||
}
|
||||
else {
|
||||
printf("caServer:: no server internals attached\n");
|
||||
}
|
||||
if (pCAS) {
|
||||
this->pCAS->setDebugLevel(level);
|
||||
}
|
||||
else {
|
||||
printf("caServer:: no server internals attached\n");
|
||||
}
|
||||
}
|
||||
|
||||
unsigned caServer::getDebugLevel () const // X aCC 361
|
||||
unsigned caServer::getDebugLevel () const
|
||||
{
|
||||
if (pCAS) {
|
||||
return this->pCAS->getDebugLevel();
|
||||
@@ -108,7 +107,7 @@ unsigned caServer::getDebugLevel () const // X aCC 361
|
||||
}
|
||||
}
|
||||
|
||||
casEventMask caServer::valueEventMask () const // X aCC 361
|
||||
casEventMask caServer::valueEventMask () const
|
||||
{
|
||||
if (pCAS) {
|
||||
return this->pCAS->valueEventMask();
|
||||
@@ -119,7 +118,7 @@ casEventMask caServer::valueEventMask () const // X aCC 361
|
||||
}
|
||||
}
|
||||
|
||||
casEventMask caServer::logEventMask () const // X aCC 361
|
||||
casEventMask caServer::logEventMask () const
|
||||
{
|
||||
if (pCAS) {
|
||||
return this->pCAS->logEventMask();
|
||||
@@ -130,7 +129,7 @@ casEventMask caServer::logEventMask () const // X aCC 361
|
||||
}
|
||||
}
|
||||
|
||||
casEventMask caServer::alarmEventMask () const // X aCC 361
|
||||
casEventMask caServer::alarmEventMask () const
|
||||
{
|
||||
if ( pCAS ) {
|
||||
return this->pCAS->alarmEventMask ();
|
||||
@@ -141,12 +140,23 @@ casEventMask caServer::alarmEventMask () const // X aCC 361
|
||||
}
|
||||
}
|
||||
|
||||
casEventMask caServer::propertyEventMask () const
|
||||
{
|
||||
if (pCAS) {
|
||||
return this->pCAS->propertyEventMask();
|
||||
}
|
||||
else {
|
||||
printf("caServer:: no server internals attached\n");
|
||||
return casEventMask();
|
||||
}
|
||||
}
|
||||
|
||||
class epicsTimer & caServer::createTimer ()
|
||||
{
|
||||
return fileDescriptorManager.createTimer ();
|
||||
}
|
||||
|
||||
unsigned caServer::subscriptionEventsProcessed () const // X aCC 361
|
||||
unsigned caServer::subscriptionEventsProcessed () const
|
||||
{
|
||||
if ( pCAS ) {
|
||||
return this->pCAS->subscriptionEventsProcessed ();
|
||||
@@ -156,7 +166,7 @@ unsigned caServer::subscriptionEventsProcessed () const // X aCC 361
|
||||
}
|
||||
}
|
||||
|
||||
unsigned caServer::subscriptionEventsPosted () const // X aCC 361
|
||||
unsigned caServer::subscriptionEventsPosted () const
|
||||
{
|
||||
if ( pCAS ) {
|
||||
return this->pCAS->subscriptionEventsPosted ();
|
||||
|
||||
@@ -47,22 +47,23 @@ caServerI::caServerI ( caServer & tool ) :
|
||||
nEventsPosted ( 0u ),
|
||||
ioInProgressCount ( 0u )
|
||||
{
|
||||
assert ( & adapter != NULL );
|
||||
assert ( & adapter != NULL );
|
||||
|
||||
// create predefined event types
|
||||
this->valueEvent = registerEvent ( "value" );
|
||||
this->logEvent = registerEvent ( "log" );
|
||||
this->alarmEvent = registerEvent ( "alarm" );
|
||||
this->logEvent = registerEvent ( "log" );
|
||||
this->alarmEvent = registerEvent ( "alarm" );
|
||||
this->propertyEvent = registerEvent ( "property" );
|
||||
|
||||
this->locateInterfaces ();
|
||||
|
||||
if (this->intfList.count()==0u) {
|
||||
errMessage (S_cas_noInterface,
|
||||
if (this->intfList.count()==0u) {
|
||||
errMessage (S_cas_noInterface,
|
||||
"- CA server internals init unable to continue");
|
||||
throw S_cas_noInterface;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
caServerI::~caServerI()
|
||||
@@ -70,22 +71,22 @@ caServerI::~caServerI()
|
||||
delete & this->beaconAnomalyGov;
|
||||
delete & this->beaconTmr;
|
||||
|
||||
// delete all clients
|
||||
// delete all clients
|
||||
while ( casStrmClient * pClient = this->clientList.get() ) {
|
||||
delete pClient;
|
||||
}
|
||||
delete pClient;
|
||||
}
|
||||
|
||||
casIntfOS *pIF;
|
||||
while ( ( pIF = this->intfList.get() ) ) {
|
||||
delete pIF;
|
||||
}
|
||||
casIntfOS *pIF;
|
||||
while ( ( pIF = this->intfList.get() ) ) {
|
||||
delete pIF;
|
||||
}
|
||||
}
|
||||
|
||||
void caServerI::destroyClient ( casStrmClient & client )
|
||||
{
|
||||
{
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
this->clientList.remove ( client );
|
||||
this->clientList.remove ( client );
|
||||
}
|
||||
delete & client;
|
||||
}
|
||||
@@ -143,11 +144,11 @@ caStatus caServerI::attachInterface ( const caNetAddr & addrIn,
|
||||
void caServerI::sendBeacon ( ca_uint32_t beaconNo )
|
||||
{
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
tsDLIter < casIntfOS > iter = this->intfList.firstIter ();
|
||||
while ( iter.valid () ) {
|
||||
iter->sendBeacon ( beaconNo );
|
||||
iter++;
|
||||
}
|
||||
tsDLIter < casIntfOS > iter = this->intfList.firstIter ();
|
||||
while ( iter.valid () ) {
|
||||
iter->sendBeacon ( beaconNo );
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
|
||||
void caServerI::generateBeaconAnomaly ()
|
||||
@@ -259,11 +260,11 @@ void caServerI::casMonitorDestroy ( casMonitor & cm )
|
||||
}
|
||||
|
||||
//
|
||||
// caServerI::dumpMsg()
|
||||
// caServerI::dumpMsg()
|
||||
//
|
||||
// Debug aid - print the header part of a message.
|
||||
// Debug aid - print the header part of a message.
|
||||
//
|
||||
// dp arg allowed to be null
|
||||
// dp arg allowed to be null
|
||||
//
|
||||
//
|
||||
void caServerI::dumpMsg ( const char * pHostName, const char * pUserName,
|
||||
|
||||
@@ -44,23 +44,24 @@ caStatus convertContainerMemberToAtomic ( class gdd & dd,
|
||||
aitUint32 appType, aitUint32 elemCount );
|
||||
|
||||
class caServerI :
|
||||
public caServerIO,
|
||||
public ioBlockedList,
|
||||
public casEventRegistry {
|
||||
public caServerIO,
|
||||
public ioBlockedList,
|
||||
public casEventRegistry {
|
||||
public:
|
||||
caServerI ( caServer &tool );
|
||||
~caServerI ();
|
||||
bool roomForNewChannel() const;
|
||||
unsigned getDebugLevel() const { return debugLevel; }
|
||||
inline void setDebugLevel ( unsigned debugLevelIn );
|
||||
void show ( unsigned level ) const;
|
||||
caServerI ( caServer &tool );
|
||||
~caServerI ();
|
||||
bool roomForNewChannel() const;
|
||||
unsigned getDebugLevel() const { return debugLevel; }
|
||||
inline void setDebugLevel ( unsigned debugLevelIn );
|
||||
void show ( unsigned level ) const;
|
||||
void destroyMonitor ( casMonitor & );
|
||||
caServer * getAdapter ();
|
||||
caServer * operator -> ();
|
||||
void connectCB ( casIntfOS & );
|
||||
casEventMask valueEventMask () const; // DBE_VALUE registerEvent("value")
|
||||
casEventMask logEventMask () const; // DBE_LOG registerEvent("log")
|
||||
casEventMask alarmEventMask () const; // DBE_ALARM registerEvent("alarm")
|
||||
caServer * getAdapter ();
|
||||
caServer * operator -> ();
|
||||
void connectCB ( casIntfOS & );
|
||||
casEventMask valueEventMask () const; // DBE_VALUE registerEvent("value")
|
||||
casEventMask logEventMask () const; // DBE_LOG registerEvent("log")
|
||||
casEventMask alarmEventMask () const; // DBE_ALARM registerEvent("alarm")
|
||||
casEventMask propertyEventMask () const; // DBE_PROPERTY registerEvent("property")
|
||||
unsigned subscriptionEventsProcessed () const;
|
||||
void incrEventsProcessedCounter ();
|
||||
unsigned subscriptionEventsPosted () const;
|
||||
@@ -82,29 +83,30 @@ public:
|
||||
private:
|
||||
clientBufMemoryManager clientBufMemMgr;
|
||||
tsFreeList < casMonitor, 1024 > casMonitorFreeList;
|
||||
tsDLList < casStrmClient > clientList;
|
||||
tsDLList < casStrmClient > clientList;
|
||||
tsDLList < casIntfOS > intfList;
|
||||
mutable epicsMutex mutex;
|
||||
mutable epicsMutex diagnosticCountersMutex;
|
||||
caServer & adapter;
|
||||
mutable epicsMutex mutex;
|
||||
mutable epicsMutex diagnosticCountersMutex;
|
||||
caServer & adapter;
|
||||
beaconTimer & beaconTmr;
|
||||
beaconAnomalyGovernor & beaconAnomalyGov;
|
||||
unsigned debugLevel;
|
||||
unsigned debugLevel;
|
||||
unsigned nEventsProcessed;
|
||||
unsigned nEventsPosted;
|
||||
unsigned ioInProgressCount;
|
||||
|
||||
casEventMask valueEvent; // DBE_VALUE registerEvent("value")
|
||||
casEventMask logEvent; // DBE_LOG registerEvent("log")
|
||||
casEventMask alarmEvent; // DBE_ALARM registerEvent("alarm")
|
||||
casEventMask logEvent; // DBE_LOG registerEvent("log")
|
||||
casEventMask alarmEvent; // DBE_ALARM registerEvent("alarm")
|
||||
casEventMask propertyEvent; // DBE_PROPERTY registerEvent("property")
|
||||
|
||||
caStatus attachInterface ( const caNetAddr & addr, bool autoBeaconAddr,
|
||||
bool addConfigAddr );
|
||||
caStatus attachInterface ( const caNetAddr & addr, bool autoBeaconAddr,
|
||||
bool addConfigAddr );
|
||||
|
||||
void sendBeacon ( ca_uint32_t beaconNo );
|
||||
|
||||
caServerI ( const caServerI & );
|
||||
caServerI & operator = ( const caServerI & );
|
||||
caServerI ( const caServerI & );
|
||||
caServerI & operator = ( const caServerI & );
|
||||
|
||||
friend class beaconAnomalyGovernor;
|
||||
friend class beaconTimer;
|
||||
@@ -113,17 +115,17 @@ private:
|
||||
|
||||
inline caServer * caServerI::getAdapter()
|
||||
{
|
||||
return & this->adapter;
|
||||
return & this->adapter;
|
||||
}
|
||||
|
||||
inline caServer * caServerI::operator -> ()
|
||||
{
|
||||
return this->getAdapter();
|
||||
return this->getAdapter();
|
||||
}
|
||||
|
||||
inline void caServerI::setDebugLevel(unsigned debugLevelIn)
|
||||
{
|
||||
this->debugLevel = debugLevelIn;
|
||||
this->debugLevel = debugLevelIn;
|
||||
}
|
||||
|
||||
inline casEventMask caServerI::valueEventMask() const
|
||||
@@ -141,6 +143,11 @@ inline casEventMask caServerI::alarmEventMask() const
|
||||
return this->alarmEvent;
|
||||
}
|
||||
|
||||
inline casEventMask caServerI::propertyEventMask() const
|
||||
{
|
||||
return this->propertyEvent;
|
||||
}
|
||||
|
||||
inline bool caServerI :: ioIsPending () const
|
||||
{
|
||||
return ( ioInProgressCount > 0u );
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -245,6 +245,7 @@ public:
|
||||
epicsShareFunc casEventMask valueEventMask () const; // DBE_VALUE
|
||||
epicsShareFunc casEventMask logEventMask () const; // DBE_LOG
|
||||
epicsShareFunc casEventMask alarmEventMask () const; // DBE_ALARM
|
||||
epicsShareFunc casEventMask propertyEventMask () const; // DBE_PROPERTY
|
||||
|
||||
epicsShareFunc void setDebugLevel ( unsigned level );
|
||||
epicsShareFunc unsigned getDebugLevel () const;
|
||||
|
||||
@@ -230,6 +230,18 @@ void casStreamIOWakeup::show ( unsigned level ) const
|
||||
printf ( "}\n" );
|
||||
}
|
||||
|
||||
//
|
||||
// casStreamOS::armRecv ()
|
||||
//
|
||||
inline void casStreamOS::armRecv()
|
||||
{
|
||||
if ( ! this->pRdReg ) {
|
||||
if ( ! this->inBufFull() ) {
|
||||
this->pRdReg = new casStreamReadReg ( *this );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// casStreamIOWakeup::expire()
|
||||
//
|
||||
@@ -297,18 +309,6 @@ void casStreamIOWakeup::start ( casStreamOS &os )
|
||||
this->pOS->printStatus ( "casStreamIOWakeup tmr start" );
|
||||
}
|
||||
|
||||
//
|
||||
// casStreamOS::armRecv ()
|
||||
//
|
||||
inline void casStreamOS::armRecv()
|
||||
{
|
||||
if ( ! this->pRdReg ) {
|
||||
if ( ! this->inBufFull() ) {
|
||||
this->pRdReg = new casStreamReadReg ( *this );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// casStreamOS::disarmRecv ()
|
||||
//
|
||||
|
||||
@@ -25,6 +25,7 @@ catools_LIBS += ca Com
|
||||
PROD_DEFAULT += caget camonitor cainfo caput
|
||||
PROD_vxWorks = -nil-
|
||||
PROD_RTEMS = -nil-
|
||||
PROD_iOS = -nil-
|
||||
|
||||
PROD_LIBS += catools ca Com
|
||||
catools_DIR = .
|
||||
|
||||
@@ -492,12 +492,12 @@ int main (int argc, char *argv[])
|
||||
if (charArrAsStr) {
|
||||
count = len;
|
||||
dbrType = DBR_CHAR;
|
||||
ebuf = calloc(strlen(cbuf), sizeof(char));
|
||||
ebuf = calloc(strlen(cbuf)+1, sizeof(char));
|
||||
if(!ebuf) {
|
||||
fprintf(stderr, "Memory allocation failed\n");
|
||||
return 1;
|
||||
}
|
||||
epicsStrnRawFromEscaped(ebuf, strlen(cbuf), cbuf, strlen(cbuf));
|
||||
epicsStrnRawFromEscaped(ebuf, strlen(cbuf)+1, cbuf, strlen(cbuf));
|
||||
} else {
|
||||
for (i = 0; i < count; ++i) {
|
||||
epicsStrnRawFromEscaped(sbuf[i], sizeof(EpicsStr), *(argv+optind+i), sizeof(EpicsStr));
|
||||
|
||||
@@ -445,10 +445,15 @@ char *dbr2str (const void *value, unsigned type)
|
||||
\
|
||||
if (charArrAsStr && dbr_type_is_CHAR(TYPE_ENUM) && (reqElems || pv->nElems > 1)) { \
|
||||
dbr_char_t *s = (dbr_char_t*) dbr_value_ptr(pv->value, pv->dbrType); \
|
||||
int dlen = epicsStrnEscapedFromRawSize((char*)s, strlen((char*)s)); \
|
||||
char *d = calloc(dlen+1, sizeof(char)); \
|
||||
size_t len = strlen((char*)s); \
|
||||
unsigned long elems = reqElems && (reqElems < pv->nElems) ? reqElems : pv->nElems; \
|
||||
int dlen; \
|
||||
char *d; \
|
||||
if (len < elems) elems = len; \
|
||||
dlen = epicsStrnEscapedFromRawSize((char*)s, elems); \
|
||||
d = calloc(dlen+1, sizeof(char)); \
|
||||
if(d) { \
|
||||
epicsStrnEscapedFromRaw(d, dlen+1, (char*)s, strlen((char*)s));\
|
||||
epicsStrnEscapedFromRaw(d, dlen+1, (char*)s, elems); \
|
||||
printf("%c%s", fieldSeparator, d); \
|
||||
free(d); \
|
||||
} else { \
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "cantProceed.h"
|
||||
#include "dbDefs.h"
|
||||
@@ -152,12 +153,12 @@ void callbackRequest(CALLBACK *pcallback)
|
||||
int lockKey;
|
||||
|
||||
if (!pcallback) {
|
||||
epicsPrintf("callbackRequest called with NULL pcallback\n");
|
||||
epicsInterruptContextMessage("callbackRequest: pcallback was NULL\n");
|
||||
return;
|
||||
}
|
||||
priority = pcallback->priority;
|
||||
if (priority < 0 || priority >= NUM_CALLBACK_PRIORITIES) {
|
||||
epicsPrintf("callbackRequest called with invalid priority\n");
|
||||
epicsInterruptContextMessage("callbackRequest: Bad priority\n");
|
||||
return;
|
||||
}
|
||||
if (ringOverflow[priority]) return;
|
||||
@@ -167,8 +168,11 @@ void callbackRequest(CALLBACK *pcallback)
|
||||
epicsInterruptUnlock(lockKey);
|
||||
|
||||
if (!pushOK) {
|
||||
errlogPrintf("callbackRequest: %s ring buffer full\n",
|
||||
threadName[priority]);
|
||||
char msg[48] = "callbackRequest: ";
|
||||
|
||||
strcat(msg, threadName[priority]);
|
||||
strcat(msg, " ring buffer full\n");
|
||||
epicsInterruptContextMessage(msg);
|
||||
ringOverflow[priority] = TRUE;
|
||||
}
|
||||
epicsEventSignal(callbackSem[priority]);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "errlog.h"
|
||||
#include "cantProceed.h"
|
||||
#include "cvtFast.h"
|
||||
#include "epicsMath.h"
|
||||
#include "epicsTime.h"
|
||||
#include "alarm.h"
|
||||
#include "ellLib.h"
|
||||
@@ -281,48 +282,41 @@ static void get_control(DBADDR *paddr, char **ppbuffer,
|
||||
}
|
||||
|
||||
static void get_alarm(DBADDR *paddr, char **ppbuffer,
|
||||
struct rset *prset,long *options)
|
||||
struct rset *prset, long *options)
|
||||
{
|
||||
struct dbr_alDouble ald;
|
||||
int got_data=FALSE;
|
||||
char *pbuffer = *ppbuffer;
|
||||
struct dbr_alDouble ald = {epicsNAN, epicsNAN, epicsNAN, epicsNAN};
|
||||
long no_data = TRUE;
|
||||
|
||||
ald.upper_alarm_limit = ald.upper_warning_limit = 0.0;
|
||||
ald.lower_warning_limit = ald.lower_alarm_limit = 0.0;
|
||||
if( prset && prset->get_alarm_double ) {
|
||||
(*prset->get_alarm_double)(paddr,&ald);
|
||||
got_data=TRUE;
|
||||
}
|
||||
if( (*options) & (DBR_AL_LONG) ) {
|
||||
char *pbuffer=*ppbuffer;
|
||||
if (prset && prset->get_alarm_double)
|
||||
no_data = prset->get_alarm_double(paddr, &ald);
|
||||
|
||||
if(got_data) {
|
||||
struct dbr_alLong *pal=(struct dbr_alLong*)pbuffer;
|
||||
pal->upper_alarm_limit = (epicsInt32)ald.upper_alarm_limit;
|
||||
pal->upper_warning_limit = (epicsInt32)ald.upper_warning_limit;
|
||||
pal->lower_warning_limit = (epicsInt32)ald.lower_warning_limit;
|
||||
pal->lower_alarm_limit = (epicsInt32)ald.lower_alarm_limit;
|
||||
} else {
|
||||
memset(pbuffer,'\0',dbr_alLong_size);
|
||||
*options = (*options) ^ DBR_AL_LONG; /*Turn off option*/
|
||||
}
|
||||
*ppbuffer = ((char *)*ppbuffer) + dbr_alLong_size;
|
||||
}
|
||||
if( (*options) & (DBR_AL_DOUBLE) ) {
|
||||
char *pbuffer=*ppbuffer;
|
||||
if (*options & DBR_AL_LONG) {
|
||||
struct dbr_alLong *pal = (struct dbr_alLong*) pbuffer;
|
||||
|
||||
if(got_data) {
|
||||
struct dbr_alDouble *pal=(struct dbr_alDouble*)pbuffer;
|
||||
pal->upper_alarm_limit = ald.upper_alarm_limit;
|
||||
pal->upper_warning_limit = ald.upper_warning_limit;
|
||||
pal->lower_warning_limit = ald.lower_warning_limit;
|
||||
pal->lower_alarm_limit = ald.lower_alarm_limit;
|
||||
} else {
|
||||
memset(pbuffer,'\0',dbr_alDouble_size);
|
||||
*options = (*options) ^ DBR_AL_DOUBLE; /*Turn off option*/
|
||||
}
|
||||
*ppbuffer = ((char *)*ppbuffer) + dbr_alDouble_size;
|
||||
}
|
||||
return;
|
||||
pal->upper_alarm_limit = (epicsInt32) ald.upper_alarm_limit;
|
||||
pal->upper_warning_limit = (epicsInt32) ald.upper_warning_limit;
|
||||
pal->lower_warning_limit = (epicsInt32) ald.lower_warning_limit;
|
||||
pal->lower_alarm_limit = (epicsInt32) ald.lower_alarm_limit;
|
||||
|
||||
if (no_data)
|
||||
*options ^= DBR_AL_LONG; /*Turn off option*/
|
||||
|
||||
*ppbuffer += dbr_alLong_size;
|
||||
}
|
||||
if (*options & DBR_AL_DOUBLE) {
|
||||
struct dbr_alDouble *pal = (struct dbr_alDouble*) pbuffer;
|
||||
|
||||
pal->upper_alarm_limit = ald.upper_alarm_limit;
|
||||
pal->upper_warning_limit = ald.upper_warning_limit;
|
||||
pal->lower_warning_limit = ald.lower_warning_limit;
|
||||
pal->lower_alarm_limit = ald.lower_alarm_limit;
|
||||
|
||||
if (no_data)
|
||||
*options ^= DBR_AL_DOUBLE; /*Turn off option*/
|
||||
|
||||
*ppbuffer += dbr_alDouble_size;
|
||||
}
|
||||
}
|
||||
|
||||
static void getOptions(DBADDR *paddr,char **poriginal,long *options,void *pflin)
|
||||
@@ -969,7 +963,7 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType,
|
||||
|
||||
case DBR_CHAR:
|
||||
case DBR_UCHAR:
|
||||
if (nRequest && *nRequest > 1) {
|
||||
if (nRequest && *nRequest > 0) {
|
||||
maxlen = *nRequest - 1;
|
||||
break;
|
||||
}
|
||||
@@ -984,8 +978,8 @@ long epicsShareAPI dbGetField(DBADDR *paddr,short dbrType,
|
||||
if (!status) status = dbFindField(&dbEntry, pfldDes->name);
|
||||
if (!status) {
|
||||
rtnString = dbGetString(&dbEntry);
|
||||
strncpy(pbuf, rtnString, maxlen - 1);
|
||||
pbuf[maxlen - 1] = 0;
|
||||
strncpy(pbuf, rtnString, maxlen);
|
||||
pbuf[maxlen] = 0;
|
||||
}
|
||||
dbFinishEntry(&dbEntry);
|
||||
} else {
|
||||
@@ -1028,7 +1022,7 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType,
|
||||
|
||||
case DBR_CHAR:
|
||||
case DBR_UCHAR:
|
||||
if (nRequest && *nRequest > 1) {
|
||||
if (nRequest && *nRequest > 0) {
|
||||
maxlen = *nRequest - 1;
|
||||
break;
|
||||
}
|
||||
@@ -1037,8 +1031,8 @@ long epicsShareAPI dbGet(DBADDR *paddr, short dbrType,
|
||||
return S_db_badDbrtype;
|
||||
}
|
||||
|
||||
strncpy(pbuf, (char *)paddr->pfield, maxlen - 1);
|
||||
pbuf[maxlen - 1] = 0;
|
||||
strncpy(pbuf, (char *)paddr->pfield, maxlen);
|
||||
pbuf[maxlen] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1442,8 +1436,9 @@ long epicsShareAPI dbPut(DBADDR *paddr, short dbrType,
|
||||
else
|
||||
offset = 0;
|
||||
if (no_elements < nRequest) nRequest = no_elements;
|
||||
status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer,
|
||||
nRequest, no_elements, offset);
|
||||
if (!status)
|
||||
status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer,
|
||||
nRequest, no_elements, offset);
|
||||
|
||||
/* update array info */
|
||||
if (!status &&
|
||||
|
||||
@@ -59,8 +59,8 @@ static epicsEventId workListEvent; /*wakeup event for dbCaTask*/
|
||||
static int removesOutstanding = 0;
|
||||
#define removesOutstandingWarning 10000
|
||||
|
||||
static enum {
|
||||
ctlRun, ctlPause, ctlExit
|
||||
static volatile enum {
|
||||
ctlInit, ctlRun, ctlPause, ctlExit
|
||||
} dbCaCtl;
|
||||
static epicsEventId startStopEvent;
|
||||
|
||||
|
||||
@@ -416,6 +416,13 @@ static long getCharChar(
|
||||
char *pbuffer = (char *)pto;
|
||||
char *psrc=(char *)(paddr->pfield);
|
||||
|
||||
if (paddr->pfldDes && paddr->pfldDes->field_type == DBF_STRING) {
|
||||
/* This is a DBF_STRING field being read as a long string.
|
||||
* The buffer we return must be zero-terminated.
|
||||
*/
|
||||
pbuffer[--nRequest] = 0;
|
||||
if (nRequest == 0) return(0);
|
||||
}
|
||||
if(nRequest==1 && offset==0) {
|
||||
*pbuffer = *psrc;
|
||||
return(0);
|
||||
@@ -436,6 +443,13 @@ static long getCharUchar(
|
||||
unsigned char *pbuffer = (unsigned char *)pto;
|
||||
char *psrc=(char *)(paddr->pfield);
|
||||
|
||||
if (paddr->pfldDes && paddr->pfldDes->field_type == DBF_STRING) {
|
||||
/* This is a DBF_STRING field being read as a long string.
|
||||
* The buffer we return must be zero-terminated.
|
||||
*/
|
||||
pbuffer[--nRequest] = 0;
|
||||
if (nRequest == 0) return(0);
|
||||
}
|
||||
if(nRequest==1 && offset==0) {
|
||||
*pbuffer = *psrc;
|
||||
return(0);
|
||||
@@ -2586,7 +2600,7 @@ static long putStringEnum(
|
||||
status = (*prset->get_enum_strs)(paddr,&enumStrs);
|
||||
if(!status) {
|
||||
nchoices = enumStrs.no_str;
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(pbuffer,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
@@ -2635,7 +2649,7 @@ static long putStringMenu(
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(pbuffer,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nChoice) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
@@ -2673,7 +2687,7 @@ static long putStringDevice(
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(pbuffer,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nChoice) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
|
||||
@@ -272,7 +272,7 @@ static long cvt_st_e(
|
||||
status = (*prset->get_enum_strs)(paddr,&enumStrs);
|
||||
if(!status) {
|
||||
nchoices = enumStrs.no_str;
|
||||
nargs = sscanf(from," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(from,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(from) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
@@ -315,7 +315,7 @@ static long cvt_st_menu(
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(from," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(from,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(from) && ind<nChoice) {
|
||||
*to = ind;
|
||||
return(0);
|
||||
@@ -347,7 +347,7 @@ static long cvt_st_device(
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(from," %u %n",&ind,&nchars);
|
||||
nargs = sscanf(from,"%u%n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(from) && ind<nChoice) {
|
||||
*to = ind;
|
||||
return(0);
|
||||
|
||||
@@ -50,12 +50,12 @@
|
||||
|
||||
|
||||
/* Task Control */
|
||||
enum ctl {ctlRun, ctlPause, ctlExit};
|
||||
enum ctl {ctlInit, ctlRun, ctlPause, ctlExit};
|
||||
|
||||
/* Task Startup/Shutdown Synchronization */
|
||||
static epicsEventId startStopEvent;
|
||||
|
||||
volatile enum ctl scanCtl;
|
||||
static volatile enum ctl scanCtl;
|
||||
|
||||
/* SCAN ONCE */
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@ long epicsShareAPI dbpf(const char *pname,const char *pvalue)
|
||||
if (nameToAddr(pname, &addr)) return -1;
|
||||
/* For enumerated types must allow for ENUM rather than string*/
|
||||
/* If entire field is digits then use DBR_ENUM else DBR_STRING*/
|
||||
if (addr.dbr_field_type == DBR_ENUM && !*pvalue &&
|
||||
if (addr.dbr_field_type == DBR_ENUM && *pvalue &&
|
||||
strspn(pvalue,"0123456789") == strlen(pvalue)) {
|
||||
unsigned short value;
|
||||
|
||||
|
||||
140
src/db/recGbl.c
140
src/db/recGbl.c
@@ -21,6 +21,7 @@
|
||||
#include <limits.h>
|
||||
|
||||
#include "dbDefs.h"
|
||||
#include "epicsMath.h"
|
||||
#include "epicsTime.h"
|
||||
#include "epicsPrint.h"
|
||||
#include "dbBase.h"
|
||||
@@ -107,64 +108,56 @@ void epicsShareAPI recGblRecSupError(long status, const struct dbAddr *paddr,
|
||||
return;
|
||||
}
|
||||
|
||||
void epicsShareAPI recGblGetPrec(const struct dbAddr *paddr,long *precision)
|
||||
void epicsShareAPI recGblGetPrec(const struct dbAddr *paddr, long *precision)
|
||||
{
|
||||
dbFldDes *pdbFldDes = paddr->pfldDes;
|
||||
|
||||
switch(pdbFldDes->field_type){
|
||||
case(DBF_SHORT):
|
||||
*precision = 0;
|
||||
break;
|
||||
case(DBF_USHORT):
|
||||
*precision = 0;
|
||||
break;
|
||||
case(DBF_LONG):
|
||||
*precision = 0;
|
||||
break;
|
||||
case(DBF_ULONG):
|
||||
*precision = 0;
|
||||
break;
|
||||
case(DBF_FLOAT):
|
||||
case(DBF_DOUBLE):
|
||||
if(*precision<0 || *precision>15) *precision=15;
|
||||
break;
|
||||
switch (pdbFldDes->field_type) {
|
||||
case DBF_CHAR:
|
||||
case DBF_UCHAR:
|
||||
case DBF_SHORT:
|
||||
case DBF_USHORT:
|
||||
case DBF_LONG:
|
||||
case DBF_ULONG:
|
||||
*precision = 0;
|
||||
break;
|
||||
|
||||
case DBF_FLOAT:
|
||||
case DBF_DOUBLE:
|
||||
if (*precision < 0 || *precision > 15)
|
||||
*precision = 15;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void epicsShareAPI recGblGetGraphicDouble(
|
||||
const struct dbAddr *paddr,struct dbr_grDouble *pgd)
|
||||
void epicsShareAPI recGblGetGraphicDouble(const struct dbAddr *paddr,
|
||||
struct dbr_grDouble *pgd)
|
||||
{
|
||||
dbFldDes *pdbFldDes = paddr->pfldDes;
|
||||
|
||||
getMaxRangeValues(pdbFldDes->field_type,&pgd->upper_disp_limit,
|
||||
&pgd->lower_disp_limit);
|
||||
|
||||
return;
|
||||
getMaxRangeValues(pdbFldDes->field_type,
|
||||
&pgd->upper_disp_limit, &pgd->lower_disp_limit);
|
||||
}
|
||||
|
||||
void epicsShareAPI recGblGetAlarmDouble(
|
||||
const struct dbAddr *paddr,struct dbr_alDouble *pad)
|
||||
void epicsShareAPI recGblGetAlarmDouble(const struct dbAddr *paddr,
|
||||
struct dbr_alDouble *pad)
|
||||
{
|
||||
pad->upper_alarm_limit = 0;
|
||||
pad->upper_warning_limit = 0;
|
||||
pad->lower_warning_limit = 0;
|
||||
pad->lower_alarm_limit = 0;
|
||||
|
||||
return;
|
||||
pad->upper_alarm_limit = epicsNAN;
|
||||
pad->upper_warning_limit = epicsNAN;
|
||||
pad->lower_warning_limit = epicsNAN;
|
||||
pad->lower_alarm_limit = epicsNAN;
|
||||
}
|
||||
|
||||
void epicsShareAPI recGblGetControlDouble(
|
||||
const struct dbAddr *paddr,struct dbr_ctrlDouble *pcd)
|
||||
void epicsShareAPI recGblGetControlDouble(const struct dbAddr *paddr,
|
||||
struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
dbFldDes *pdbFldDes=paddr->pfldDes;
|
||||
dbFldDes *pdbFldDes = paddr->pfldDes;
|
||||
|
||||
getMaxRangeValues(pdbFldDes->field_type,&pcd->upper_ctrl_limit,
|
||||
&pcd->lower_ctrl_limit);
|
||||
|
||||
return;
|
||||
getMaxRangeValues(pdbFldDes->field_type,
|
||||
&pcd->upper_ctrl_limit, &pcd->lower_ctrl_limit);
|
||||
}
|
||||
|
||||
int epicsShareAPI recGblInitConstantLink(
|
||||
@@ -319,40 +312,39 @@ static void getMaxRangeValues(short field_type, double *pupper_limit,
|
||||
double *plower_limit)
|
||||
{
|
||||
switch(field_type){
|
||||
case(DBF_CHAR):
|
||||
*pupper_limit = -128.0;
|
||||
*plower_limit = 127.0;
|
||||
break;
|
||||
case(DBF_UCHAR):
|
||||
*pupper_limit = 255.0;
|
||||
*plower_limit = 0.0;
|
||||
break;
|
||||
case(DBF_SHORT):
|
||||
*pupper_limit = (double)SHRT_MAX;
|
||||
*plower_limit = (double)SHRT_MIN;
|
||||
break;
|
||||
case(DBF_ENUM):
|
||||
case(DBF_USHORT):
|
||||
*pupper_limit = (double)USHRT_MAX;
|
||||
*plower_limit = (double)0;
|
||||
break;
|
||||
case(DBF_LONG):
|
||||
/* long did not work using cast to double */
|
||||
*pupper_limit = 2147483647.;
|
||||
*plower_limit = -2147483648.;
|
||||
break;
|
||||
case(DBF_ULONG):
|
||||
*pupper_limit = (double)ULONG_MAX;
|
||||
*plower_limit = (double)0;
|
||||
break;
|
||||
case(DBF_FLOAT):
|
||||
*pupper_limit = (double)1e+30;
|
||||
*plower_limit = (double)-1e30;
|
||||
break;
|
||||
case(DBF_DOUBLE):
|
||||
*pupper_limit = (double)1e+30;
|
||||
*plower_limit = (double)-1e30;
|
||||
break;
|
||||
case DBF_CHAR:
|
||||
*pupper_limit = -128.0;
|
||||
*plower_limit = 127.0;
|
||||
break;
|
||||
case DBF_UCHAR:
|
||||
*pupper_limit = 255.0;
|
||||
*plower_limit = 0.0;
|
||||
break;
|
||||
case DBF_SHORT:
|
||||
*pupper_limit = (double) SHRT_MAX;
|
||||
*plower_limit = (double) SHRT_MIN;
|
||||
break;
|
||||
case DBF_ENUM:
|
||||
case DBF_USHORT:
|
||||
*pupper_limit = (double) USHRT_MAX;
|
||||
*plower_limit = 0.0;
|
||||
break;
|
||||
case DBF_LONG:
|
||||
*pupper_limit = 2147483647.0;
|
||||
*plower_limit = -2147483648.0;
|
||||
break;
|
||||
case DBF_ULONG:
|
||||
*pupper_limit = (double) 0xffffffffU;
|
||||
*plower_limit = 0.0;
|
||||
break;
|
||||
case DBF_FLOAT:
|
||||
*pupper_limit = 1e30;
|
||||
*plower_limit = -1e30;
|
||||
break;
|
||||
case DBF_DOUBLE:
|
||||
*pupper_limit = 1e300;
|
||||
*plower_limit = -1e300;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -907,43 +907,52 @@ static void dbBreakBody(void)
|
||||
pgphentry->userPvt = pnewbrkTable;
|
||||
}
|
||||
|
||||
static void dbRecordHead(char *recordType,char *name, int visible)
|
||||
static void dbRecordHead(char *recordType, char *name, int visible)
|
||||
{
|
||||
DBENTRY *pdbentry;
|
||||
long status;
|
||||
char *badch;
|
||||
DBENTRY *pdbentry;
|
||||
long status;
|
||||
|
||||
badch = strpbrk(name, " \"'.$");
|
||||
if (badch) {
|
||||
epicsPrintf("Bad character '%c' in record name \"%s\"\n",
|
||||
*badch, name);
|
||||
}
|
||||
pdbentry = dbAllocEntry(pdbbase);
|
||||
if(ellCount(&tempList))
|
||||
yyerrorAbort("dbRecordHead: tempList not empty");
|
||||
if (ellCount(&tempList))
|
||||
yyerrorAbort("dbRecordHead: tempList not empty");
|
||||
allocTemp(pdbentry);
|
||||
status = dbFindRecordType(pdbentry,recordType);
|
||||
if(status) {
|
||||
epicsPrintf("Record \"%s\" is of unknown type \"%s\" - ",
|
||||
status = dbFindRecordType(pdbentry, recordType);
|
||||
if (status) {
|
||||
epicsPrintf("Record \"%s\" is of unknown type \"%s\" - ",
|
||||
name, recordType);
|
||||
yyerrorAbort(NULL);
|
||||
return;
|
||||
yyerrorAbort(NULL);
|
||||
return;
|
||||
}
|
||||
/*Duplicate records ok if the same type */
|
||||
status = dbCreateRecord(pdbentry,name);
|
||||
if(status==S_dbLib_recExists) {
|
||||
if(strcmp(recordType,dbGetRecordTypeName(pdbentry))!=0) {
|
||||
epicsPrintf("Record %s already defined with different type %s\n",
|
||||
name, dbGetRecordTypeName(pdbentry));
|
||||
if (status==S_dbLib_recExists) {
|
||||
if (strcmp(recordType, dbGetRecordTypeName(pdbentry))!=0) {
|
||||
epicsPrintf("Record \"%s\" already defined with different type "
|
||||
"\"%s\"\n", name, dbGetRecordTypeName(pdbentry));
|
||||
yyerror(NULL);
|
||||
duplicate = TRUE;
|
||||
return;
|
||||
} else if (dbRecordsOnceOnly) {
|
||||
epicsPrintf("Record \"%s\" already defined (dbRecordsOnceOnly is set)\n",
|
||||
name);
|
||||
yyerror(NULL);
|
||||
duplicate = TRUE;
|
||||
}
|
||||
} else if(status) {
|
||||
epicsPrintf("Can't create record \"%s\" of type \"%s\"\n",
|
||||
name, recordType);
|
||||
yyerrorAbort(NULL);
|
||||
duplicate = TRUE;
|
||||
return;
|
||||
}
|
||||
else if (dbRecordsOnceOnly) {
|
||||
epicsPrintf("Record \"%s\" already defined (dbRecordsOnceOnly is "
|
||||
"set)\n", name);
|
||||
yyerror(NULL);
|
||||
duplicate = TRUE;
|
||||
}
|
||||
}
|
||||
if(visible) dbVisibleRecord(pdbentry);
|
||||
else if (status) {
|
||||
epicsPrintf("Can't create record \"%s\" of type \"%s\"\n",
|
||||
name, recordType);
|
||||
yyerrorAbort(NULL);
|
||||
}
|
||||
if (visible)
|
||||
dbVisibleRecord(pdbentry);
|
||||
}
|
||||
|
||||
static void dbRecordField(char *name,char *value)
|
||||
|
||||
@@ -3916,7 +3916,7 @@ void epicsShareAPI dbDumpField(
|
||||
else
|
||||
printf("\t field_type: %s\n", pamapdbfType[j].strvalue);
|
||||
printf("\tprocess_passive: %hd\n",pdbFldDes->process_passive);
|
||||
printf("\t base: %hd\n",pdbFldDes->base);
|
||||
printf("\t base: %d\n",pdbFldDes->base);
|
||||
if(!pdbFldDes->promptgroup) {
|
||||
printf("\t promptgroup: %d\n",pdbFldDes->promptgroup);
|
||||
} else {
|
||||
@@ -3929,7 +3929,7 @@ void epicsShareAPI dbDumpField(
|
||||
}
|
||||
}
|
||||
printf("\t interest: %hd\n", pdbFldDes->interest);
|
||||
printf("\t as_level: %hd\n",pdbFldDes->as_level);
|
||||
printf("\t as_level: %d\n",pdbFldDes->as_level);
|
||||
printf("\t initial: %s\n",
|
||||
(pdbFldDes->initial ? pdbFldDes->initial : ""));
|
||||
if(pdbFldDes->field_type==DBF_MENU) {
|
||||
@@ -4059,12 +4059,12 @@ void epicsShareAPI dbReportDeviceConfig(dbBase *pdbbase,FILE *report)
|
||||
DBENTRY dbentry;
|
||||
DBENTRY *pdbentry=&dbentry;
|
||||
long status;
|
||||
char busName[40];
|
||||
char linkValue[40];
|
||||
char dtypValue[40];
|
||||
char linkValue[messagesize];
|
||||
char dtypValue[50];
|
||||
char cvtValue[40];
|
||||
int ilink,nlinks;
|
||||
struct link *plink;
|
||||
int linkType;
|
||||
FILE *stream = (report==0) ? stdout : report;
|
||||
|
||||
if(!pdbbase) {
|
||||
@@ -4081,8 +4081,8 @@ void epicsShareAPI dbReportDeviceConfig(dbBase *pdbbase,FILE *report)
|
||||
status = dbGetLinkField(pdbentry,ilink);
|
||||
if(status || dbGetLinkType(pdbentry)!=DCT_LINK_FORM) continue;
|
||||
plink = pdbentry->pfield;
|
||||
strcpy(busName,bus[plink->type]);
|
||||
if(strlen(busName)==0) continue;
|
||||
linkType = plink->type;
|
||||
if(bus[linkType][0]==0) continue;
|
||||
strcpy(linkValue,dbGetString(pdbentry));
|
||||
status = dbFindField(pdbentry,"DTYP");
|
||||
if(status) break;
|
||||
@@ -4106,7 +4106,7 @@ void epicsShareAPI dbReportDeviceConfig(dbBase *pdbbase,FILE *report)
|
||||
}
|
||||
}
|
||||
fprintf(stream,"%-8s %-20s %-20s %-20s %-s\n",
|
||||
busName,linkValue,dtypValue,
|
||||
bus[linkType],linkValue,dtypValue,
|
||||
dbGetRecordName(pdbentry),cvtValue);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1109,7 +1109,7 @@ gddStatus gdd::clearData(void)
|
||||
str->clear();
|
||||
}
|
||||
else if ( this->primitiveType() == aitEnumFixedString ) {
|
||||
memset ( this->data.FString, '\0', sizeof ( this->data.FString ) );
|
||||
memset ( this->data.FString, '\0', sizeof(aitFixedString) );
|
||||
}
|
||||
else {
|
||||
memset ( & this->data, '\0', sizeof ( this->data ) );
|
||||
|
||||
@@ -71,6 +71,7 @@ static const ELEMENT operands[] = {
|
||||
{"-", 7, 8, 0, UNARY_OPERATOR, UNARY_NEG},
|
||||
{".", 0, 0, 1, LITERAL_OPERAND,LITERAL_DOUBLE},
|
||||
{"0", 0, 0, 1, LITERAL_OPERAND,LITERAL_DOUBLE},
|
||||
{"0X", 0, 0, 1, LITERAL_OPERAND,LITERAL_INT},
|
||||
{"1", 0, 0, 1, LITERAL_OPERAND,LITERAL_DOUBLE},
|
||||
{"2", 0, 0, 1, LITERAL_OPERAND,LITERAL_DOUBLE},
|
||||
{"3", 0, 0, 1, LITERAL_OPERAND,LITERAL_DOUBLE},
|
||||
@@ -237,29 +238,42 @@ epicsShareFunc long
|
||||
operand_needed = FALSE;
|
||||
break;
|
||||
|
||||
case LITERAL_OPERAND:
|
||||
runtime_depth += pel->runtime_effect;
|
||||
case LITERAL_OPERAND:
|
||||
runtime_depth += pel->runtime_effect;
|
||||
|
||||
psrc -= strlen(pel->name);
|
||||
lit_d = epicsStrtod(psrc, &pnext);
|
||||
if (pnext == psrc) {
|
||||
*perror = CALC_ERR_BAD_LITERAL;
|
||||
goto bad;
|
||||
}
|
||||
psrc = pnext;
|
||||
lit_i = lit_d;
|
||||
if (lit_d != (double) lit_i) {
|
||||
*pout++ = pel->code;
|
||||
memcpy(pout, (void *)&lit_d, sizeof(double));
|
||||
pout += sizeof(double);
|
||||
} else {
|
||||
*pout++ = LITERAL_INT;
|
||||
memcpy(pout, (void *)&lit_i, sizeof(int));
|
||||
pout += sizeof(int);
|
||||
}
|
||||
psrc -= strlen(pel->name);
|
||||
if (pel->code == LITERAL_DOUBLE) {
|
||||
lit_d = epicsStrtod(psrc, &pnext);
|
||||
if (pnext == psrc) {
|
||||
*perror = CALC_ERR_BAD_LITERAL;
|
||||
goto bad;
|
||||
}
|
||||
psrc = pnext;
|
||||
lit_i = lit_d;
|
||||
if (lit_d != (double) lit_i) {
|
||||
*pout++ = pel->code;
|
||||
memcpy(pout, (void *)&lit_d, sizeof(double));
|
||||
pout += sizeof(double);
|
||||
} else {
|
||||
*pout++ = LITERAL_INT;
|
||||
memcpy(pout, (void *)&lit_i, sizeof(int));
|
||||
pout += sizeof(int);
|
||||
}
|
||||
}
|
||||
else {
|
||||
lit_i = strtoul(psrc, &pnext, 0);
|
||||
if (pnext == psrc) {
|
||||
*perror = CALC_ERR_BAD_LITERAL;
|
||||
goto bad;
|
||||
}
|
||||
psrc = pnext;
|
||||
*pout++ = LITERAL_INT;
|
||||
memcpy(pout, (void *)&lit_i, sizeof(int));
|
||||
pout += sizeof(int);
|
||||
}
|
||||
|
||||
operand_needed = FALSE;
|
||||
break;
|
||||
operand_needed = FALSE;
|
||||
break;
|
||||
|
||||
case STORE_OPERATOR:
|
||||
if (pout == ppostfix || pstacktop > stack ||
|
||||
|
||||
@@ -545,10 +545,19 @@ iocshBody (const char *pathname, const char *commandLine)
|
||||
lineno++;
|
||||
|
||||
/*
|
||||
* Ignore comment lines other than to echo
|
||||
* them if they came from a script.
|
||||
* Skip leading white-space
|
||||
*/
|
||||
if (*raw == '#') {
|
||||
icin = 0;
|
||||
while ((c = raw[icin]) && isspace(c)) {
|
||||
icin++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore comment lines other than to echo
|
||||
* them if they came from a script. This
|
||||
* avoids macLib errors from comments.
|
||||
*/
|
||||
if (c == '#') {
|
||||
if ((prompt == NULL) && (commandLine == NULL))
|
||||
puts(raw);
|
||||
continue;
|
||||
@@ -562,15 +571,28 @@ iocshBody (const char *pathname, const char *commandLine)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Echo commands read from scripts
|
||||
* Skip leading white-space coming from a macro
|
||||
*/
|
||||
while ((c = line[icin]) && isspace(c)) {
|
||||
icin++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Echo non-empty lines read from a script
|
||||
*/
|
||||
if ((prompt == NULL) && *line && (commandLine == NULL))
|
||||
puts(line);
|
||||
|
||||
/*
|
||||
* Ignore lines that became a comment or empty after macro expansion
|
||||
*/
|
||||
if (!c || c == '#')
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Break line into words
|
||||
*/
|
||||
icout = icin = 0;
|
||||
icout = 0;
|
||||
inword = 0;
|
||||
argc = 0;
|
||||
quote = EOF;
|
||||
|
||||
@@ -94,6 +94,7 @@ epicsShareExtern devLibVME *pdevLibVME;
|
||||
|
||||
#ifndef NO_DEVLIB_COMPAT
|
||||
# define pdevLibVirtualOS pdevLibVME
|
||||
typedef devLibVME devLibVirtualOS;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <syslog.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <rtems.h>
|
||||
#include <rtems/error.h>
|
||||
@@ -364,16 +365,15 @@ epicsThreadSleep (double seconds)
|
||||
{
|
||||
rtems_status_code sc;
|
||||
rtems_interval delay;
|
||||
extern double rtemsTicksPerTwoSeconds_double;
|
||||
|
||||
if (seconds <= 0.0) {
|
||||
delay = 0;
|
||||
extern double rtemsTicksPerSecond_double;
|
||||
|
||||
if (seconds > 0.0) {
|
||||
seconds *= rtemsTicksPerSecond_double;
|
||||
seconds += 0.99999999; /* 8 9s here is optimal */
|
||||
delay = (seconds >= INT_MAX) ? INT_MAX : (int) seconds;
|
||||
}
|
||||
else {
|
||||
delay = seconds * rtemsTicksPerTwoSeconds_double;
|
||||
delay = (delay + 1) / 2;
|
||||
if (delay == 0)
|
||||
delay++;
|
||||
else { /* seconds <= 0 or NAN */
|
||||
delay = 0;
|
||||
}
|
||||
sc = rtems_task_wake_after (delay);
|
||||
if(sc != RTEMS_SUCCESSFUL)
|
||||
|
||||
@@ -11,6 +11,11 @@
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#ifndef _MSC_VER
|
||||
/* Older versions of MinGW omitted this prototype from stdio.h */
|
||||
_CRTIMP int __cdecl __MINGW_NOTHROW _vscprintf (const char*, va_list);
|
||||
#endif
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "epicsStdio.h"
|
||||
|
||||
@@ -18,26 +23,12 @@ int epicsShareAPI epicsVsnprintf(char *str, size_t len,
|
||||
const char *fmt, va_list ap)
|
||||
{
|
||||
int retval = _vsnprintf(str, len, fmt, ap);
|
||||
|
||||
#ifdef _MSC_VER
|
||||
int needed = _vscprintf(fmt, ap);
|
||||
|
||||
if ((int) len < needed + 1) {
|
||||
str[len - 1] = 0;
|
||||
return needed;
|
||||
}
|
||||
#else
|
||||
/* Unfortunately MINGW doesn't provide _vscprintf and their
|
||||
* _vsnprintf follows MS' broken return value semantics.
|
||||
*/
|
||||
if (retval == -1) {
|
||||
if (len)
|
||||
str[len - 1] = 0;
|
||||
return len;
|
||||
} else if (retval == (int) len) {
|
||||
str[--retval] = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -446,7 +446,10 @@ epicsShareFunc epicsThreadBooleanStatus epicsShareAPI epicsThreadHighestPriority
|
||||
epicsShareFunc unsigned int epicsShareAPI
|
||||
epicsThreadGetStackSize ( epicsThreadStackSizeClass stackSizeClass )
|
||||
{
|
||||
static const unsigned stackSizeTable[epicsThreadStackBig+1] = {4000, 6000, 11000};
|
||||
#define STACK_SIZE(f) (f * 0x10000 * sizeof(void *))
|
||||
static const unsigned stackSizeTable[epicsThreadStackBig+1] = {
|
||||
STACK_SIZE(1), STACK_SIZE(2), STACK_SIZE(4)
|
||||
};
|
||||
|
||||
if (stackSizeClass<epicsThreadStackSmall) {
|
||||
fprintf ( stderr,
|
||||
@@ -776,18 +779,15 @@ epicsShareFunc void epicsShareAPI epicsThreadSleep ( double seconds )
|
||||
static const unsigned mSecPerSec = 1000;
|
||||
DWORD milliSecDelay;
|
||||
|
||||
if ( seconds <= 0.0 ) {
|
||||
if ( seconds > 0.0 ) {
|
||||
seconds *= mSecPerSec;
|
||||
seconds += 0.99999999; /* 8 9s here is optimal */
|
||||
milliSecDelay = ( seconds >= INFINITE ) ?
|
||||
INFINITE - 1 : ( DWORD ) seconds;
|
||||
}
|
||||
else { /* seconds <= 0 or NAN */
|
||||
milliSecDelay = 0u;
|
||||
}
|
||||
else if ( seconds >= INFINITE / mSecPerSec ) {
|
||||
milliSecDelay = INFINITE - 1;
|
||||
}
|
||||
else {
|
||||
milliSecDelay = ( DWORD ) ( ( seconds * mSecPerSec ) + 0.5 );
|
||||
if ( milliSecDelay == 0 ) {
|
||||
milliSecDelay = 1;
|
||||
}
|
||||
}
|
||||
Sleep ( milliSecDelay );
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,8 @@ static int osdTimeGetCurrent ( epicsTimeStamp *pDest );
|
||||
// for mingw
|
||||
#if !defined ( MAXLONGLONG )
|
||||
#define MAXLONGLONG LL_CONSTANT(0x7fffffffffffffff)
|
||||
#endif
|
||||
#if !defined ( MINLONGLONG )
|
||||
#define MINLONGLONG LL_CONSTANT(~0x7fffffffffffffff)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -189,8 +189,12 @@ epicsReadlineEnd (void *context)
|
||||
#include <ledLib.h>
|
||||
#define LEDLIB_LINESIZE 1000
|
||||
|
||||
#ifndef _WRS_VXWORKS_MAJOR
|
||||
typedef int LED_ID;
|
||||
#endif
|
||||
|
||||
struct readlineContext {
|
||||
int ledId;
|
||||
LED_ID ledId;
|
||||
char line[LEDLIB_LINESIZE];
|
||||
FILE *in;
|
||||
};
|
||||
@@ -205,7 +209,7 @@ epicsReadlineBegin(FILE *in)
|
||||
|
||||
readlineContext = malloc(sizeof *readlineContext);
|
||||
if (readlineContext != NULL) {
|
||||
readlineContext->ledId = ERROR;
|
||||
readlineContext->ledId = (LED_ID) ERROR;
|
||||
readlineContext->in = in;
|
||||
if (in == NULL) {
|
||||
long i = 50;
|
||||
@@ -213,7 +217,7 @@ epicsReadlineBegin(FILE *in)
|
||||
envGetLongConfigParam(&IOCSH_HISTSIZE, &i);
|
||||
if (i < 1) i = 1;
|
||||
readlineContext->ledId = ledOpen(fileno(stdin), fileno(stdout), i);
|
||||
if (readlineContext->ledId == ERROR) {
|
||||
if (readlineContext->ledId == (LED_ID) ERROR) {
|
||||
readlineContext->in = stdin;
|
||||
printf("Warning -- Unabled to allocate space for command-line history.\n");
|
||||
printf("Warning -- Command-line editting disabled.\n");
|
||||
@@ -236,7 +240,7 @@ epicsReadline (const char *prompt, void *context)
|
||||
fputs(prompt, stdout);
|
||||
fflush(stdout);
|
||||
}
|
||||
if (readlineContext->ledId != ERROR) {
|
||||
if (readlineContext->ledId != (LED_ID) ERROR) {
|
||||
i = ledRead(readlineContext->ledId, readlineContext->line, LEDLIB_LINESIZE-1);
|
||||
if (i < 0)
|
||||
return NULL;
|
||||
@@ -262,7 +266,7 @@ epicsReadlineEnd (void *context)
|
||||
struct readlineContext *readlineContext = context;
|
||||
|
||||
if (readlineContext) {
|
||||
if (readlineContext->ledId != ERROR)
|
||||
if (readlineContext->ledId != (LED_ID) ERROR)
|
||||
ledClose(readlineContext->ledId);
|
||||
free(readlineContext);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifdef isfinite
|
||||
# undef finite
|
||||
# define finite(x) isfinite(x)
|
||||
#endif
|
||||
|
||||
epicsShareExtern float epicsNAN;
|
||||
epicsShareExtern float epicsINF;
|
||||
|
||||
|
||||
@@ -398,9 +398,6 @@ static void epicsThreadInit(void)
|
||||
}
|
||||
|
||||
|
||||
#define ARCH_STACK_FACTOR 1024
|
||||
|
||||
|
||||
epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize (epicsThreadStackSizeClass stackSizeClass)
|
||||
{
|
||||
#if ! defined (_POSIX_THREAD_ATTR_STACKSIZE)
|
||||
@@ -408,8 +405,10 @@ epicsShareFunc unsigned int epicsShareAPI epicsThreadGetStackSize (epicsThreadSt
|
||||
#elif defined (OSITHREAD_USE_DEFAULT_STACK)
|
||||
return 0;
|
||||
#else
|
||||
static const unsigned stackSizeTable[epicsThreadStackBig+1] =
|
||||
{128*ARCH_STACK_FACTOR, 256*ARCH_STACK_FACTOR, 512*ARCH_STACK_FACTOR};
|
||||
#define STACK_SIZE(f) (f * 0x10000 * sizeof(void *))
|
||||
static const unsigned stackSizeTable[epicsThreadStackBig+1] = {
|
||||
STACK_SIZE(1), STACK_SIZE(2), STACK_SIZE(4)
|
||||
};
|
||||
if (stackSizeClass<epicsThreadStackSmall) {
|
||||
errlogPrintf("epicsThreadGetStackSize illegal argument (too small)");
|
||||
return stackSizeTable[epicsThreadStackBig];
|
||||
@@ -674,9 +673,15 @@ epicsShareFunc void epicsShareAPI epicsThreadSleep(double seconds)
|
||||
struct timespec remainingTime;
|
||||
double nanoseconds;
|
||||
|
||||
delayTime.tv_sec = (time_t)seconds;
|
||||
nanoseconds = (seconds - (double)delayTime.tv_sec) *1e9;
|
||||
delayTime.tv_nsec = (long)nanoseconds;
|
||||
if (seconds > 0) {
|
||||
delayTime.tv_sec = seconds;
|
||||
nanoseconds = (seconds - delayTime.tv_sec) *1e9;
|
||||
delayTime.tv_nsec = nanoseconds;
|
||||
}
|
||||
else {
|
||||
delayTime.tv_sec = 0;
|
||||
delayTime.tv_nsec = 0;
|
||||
}
|
||||
while (nanosleep(&delayTime, &remainingTime) == -1 &&
|
||||
errno == EINTR)
|
||||
delayTime = remainingTime;
|
||||
|
||||
@@ -30,9 +30,7 @@ static size_t osdMaxBlockSize = 0;
|
||||
|
||||
static void osdSufficentSpaceInPoolQuery ()
|
||||
{
|
||||
int temp = memFindMax ();
|
||||
|
||||
osdMaxBlockSize = ( temp > 0 ) ? (size_t) temp : 0;
|
||||
osdMaxBlockSize = (size_t) memFindMax ();
|
||||
}
|
||||
|
||||
static void osdSufficentSpaceInPoolPoll ( void *pArgIn )
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
@@ -279,11 +280,13 @@ void epicsThreadSleep(double seconds)
|
||||
STATUS status;
|
||||
int ticks;
|
||||
|
||||
if(seconds<=0.0) {
|
||||
if (seconds > 0.0) {
|
||||
seconds *= sysClkRateGet();
|
||||
seconds += 0.99999999; /* 8 9s here is optimal */
|
||||
ticks = (seconds >= INT_MAX) ? INT_MAX : (int) seconds;
|
||||
}
|
||||
else { /* seconds <= 0 or NAN */
|
||||
ticks = 0;
|
||||
} else {
|
||||
ticks = seconds*sysClkRateGet() + 0.5;
|
||||
if(ticks<=0) ticks = 1;
|
||||
}
|
||||
status = taskDelay(ticks);
|
||||
if(status) errlogPrintf("epicsThreadSleep\n");
|
||||
|
||||
@@ -69,8 +69,8 @@ static epicsMutexId fLock;
|
||||
static ELLLIST fList = ELLLIST_INIT;
|
||||
|
||||
/* Watchdog task control */
|
||||
static enum {
|
||||
twdctlRun, twdctlDisable, twdctlExit
|
||||
static volatile enum {
|
||||
twdctlInit, twdctlRun, twdctlDisable, twdctlExit
|
||||
} twdCtl;
|
||||
static epicsEventId loopEvent;
|
||||
static epicsEventId exitEvent;
|
||||
|
||||
@@ -60,9 +60,9 @@ void Test :: execute ()
|
||||
|
||||
for ( unsigned i = 0; i < 3; i++ ) {
|
||||
double mVal = rand ();
|
||||
mVal /= (RAND_MAX + 1);
|
||||
mVal /= (RAND_MAX + 1.0);
|
||||
double fEVal = rand ();
|
||||
fEVal /= (RAND_MAX + 1);
|
||||
fEVal /= (RAND_MAX + 1.0);
|
||||
fEVal *= DBL_MAX_EXP - DBL_MIN_EXP;
|
||||
fEVal += DBL_MIN_EXP;
|
||||
int eVal = static_cast < int > ( fEVal + 0.5 );
|
||||
@@ -72,7 +72,7 @@ void Test :: execute ()
|
||||
_measure ();
|
||||
}
|
||||
_srcVal = rand ();
|
||||
_srcVal /= (RAND_MAX + 1);
|
||||
_srcVal /= (RAND_MAX + 1.0);
|
||||
_srcVal *= 10.0;
|
||||
_srcVal -= 5.0;
|
||||
for ( _prec = lowPrecision;
|
||||
|
||||
@@ -238,7 +238,7 @@ MAIN(epicsCalcTest)
|
||||
const double a=1.0, b=2.0, c=3.0, d=4.0, e=5.0, f=6.0,
|
||||
g=7.0, h=8.0, i=9.0, j=10.0, k=11.0, l=12.0;
|
||||
|
||||
testPlan(566);
|
||||
testPlan(577);
|
||||
|
||||
/* LITERAL_OPERAND elements */
|
||||
testExpr(0);
|
||||
@@ -253,6 +253,11 @@ MAIN(epicsCalcTest)
|
||||
testExpr(9);
|
||||
testExpr(.1);
|
||||
testExpr(0.1);
|
||||
testExpr(0X0);
|
||||
testExpr(0x10);
|
||||
testExpr(0x7fffffff);
|
||||
testCalc("0x80000000", -2147483648.0);
|
||||
testCalc("0xffffffff", -1);
|
||||
testExpr(Inf);
|
||||
testCalc("Infinity", Inf);
|
||||
testExpr(NaN);
|
||||
@@ -287,6 +292,7 @@ MAIN(epicsCalcTest)
|
||||
testExpr(-1);
|
||||
testExpr(-Inf);
|
||||
testExpr(- -1);
|
||||
testCalc("-0x80000000", 2147483648.0);
|
||||
|
||||
/* UNARY_OPERATOR elements */
|
||||
testExpr((1));
|
||||
@@ -325,11 +331,15 @@ MAIN(epicsCalcTest)
|
||||
testExpr(isinf(NaN));
|
||||
testExpr(isnan(0));
|
||||
testExpr(isnan(Inf));
|
||||
testExpr(isnan(-Inf));
|
||||
testExpr(isnan(NaN));
|
||||
testCalc("isnan(0,1,2)", 0);
|
||||
testCalc("isnan(0,1,NaN)", 1);
|
||||
testCalc("isnan(0,NaN,2)", 1);
|
||||
testCalc("isnan(NaN,1,2)", 1);
|
||||
testCalc("isnan(0,1,Inf)", 0);
|
||||
testCalc("isnan(0,Inf,2)", 0);
|
||||
testCalc("isnan(Inf,1,2)", 0);
|
||||
testCalc("isnan(0,1,-Inf)", 0);
|
||||
testCalc("isnan(0,-Inf,2)", 0);
|
||||
testCalc("isnan(-Inf,1,2)", 0);
|
||||
@@ -851,6 +861,7 @@ MAIN(epicsCalcTest)
|
||||
testArgs("13.1;B:=A;A:=B;C:=D;D:=C", A_A|A_D, A_A|A_B|A_C|A_D);
|
||||
|
||||
// Malformed expressions
|
||||
testBadExpr("0x0.1", CALC_ERR_SYNTAX);
|
||||
testBadExpr("1*", CALC_ERR_INCOMPLETE);
|
||||
testBadExpr("*1", CALC_ERR_SYNTAX);
|
||||
testBadExpr("MIN", CALC_ERR_INCOMPLETE);
|
||||
|
||||
@@ -85,8 +85,13 @@ void testStdoutRedir (const char *report)
|
||||
testOk1(stdout == realStdout);
|
||||
|
||||
errno = 0;
|
||||
if (!testOk1(!fclose(stream)))
|
||||
testDiag("fclose error: %s\n", strerror(errno));
|
||||
if (!testOk1(!fclose(stream))) {
|
||||
testDiag("fclose error: %s", strerror(errno));
|
||||
#ifdef vxWorks
|
||||
testDiag("The above test fails if you don't cd to a writable directory");
|
||||
testDiag("before running the test. The next test will also fail...");
|
||||
#endif
|
||||
}
|
||||
|
||||
if (!testOk1((stream = fopen(report, "r")) != NULL)) {
|
||||
testDiag("'%s' could not be opened for reading: %s",
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
/*
|
||||
* Authors: Jeff Hill, Marty Kraimer and Andrew Johnson
|
||||
*/
|
||||
|
||||
#ifdef __SUNPRO_CC
|
||||
using namespace std;
|
||||
#endif
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdio>
|
||||
#include <ctime>
|
||||
@@ -33,22 +38,17 @@ struct l_fp { /* NTP time stamp */
|
||||
epicsUInt32 l_uf; /* fractional seconds */
|
||||
};
|
||||
|
||||
epicsTime useSomeCPU;
|
||||
|
||||
static const unsigned mSecPerSec = 1000u;
|
||||
static const unsigned uSecPerSec = 1000u * mSecPerSec;
|
||||
static const unsigned nSecPerSec = 1000u * uSecPerSec;
|
||||
|
||||
static const double precisionEPICS = 1.0 / nSecPerSec;
|
||||
|
||||
MAIN(epicsTimeTest)
|
||||
{
|
||||
const unsigned wasteTime = 100000u;
|
||||
const int wasteTime = 100000;
|
||||
const int nTimes = 10;
|
||||
const double precisionEPICS = 1.0 / nSecPerSec;
|
||||
|
||||
testPlan(15 + nTimes * 18);
|
||||
|
||||
const epicsTime begin = epicsTime::getCurrent();
|
||||
testPlan(16 + nTimes * 18);
|
||||
|
||||
{
|
||||
const epicsTimeStamp epochTS = {0, 0};
|
||||
@@ -61,16 +61,6 @@ MAIN(epicsTimeTest)
|
||||
testOk1(epicsEpoch.ansi_tm.tm_year == 90);
|
||||
}
|
||||
|
||||
{
|
||||
epicsTime tsi = epicsTime::getCurrent ();
|
||||
l_fp ntp = tsi;
|
||||
epicsTime tsf = ntp;
|
||||
const double diff = fabs ( tsf - tsi );
|
||||
// the difference in the precision of the two time formats
|
||||
static const double precisionNTP = 1.0 / ( 1.0 + 0xffffffff );
|
||||
testOk1(diff <= precisionEPICS + precisionNTP);
|
||||
}
|
||||
|
||||
{ // badNanosecTest
|
||||
static const char * pFormat = "%a %b %d %Y %H:%M:%S.%4f";
|
||||
try {
|
||||
@@ -85,7 +75,7 @@ MAIN(epicsTimeTest)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
{ // strftime() output
|
||||
char buf[80];
|
||||
epicsTime et;
|
||||
|
||||
@@ -120,70 +110,87 @@ MAIN(epicsTimeTest)
|
||||
pFormat = "%%S.%%05f";
|
||||
et.strftime(buf, sizeof(buf), pFormat);
|
||||
testOk(strcmp(buf, "%S.%05f") == 0, "'%s' => '%s'", pFormat, buf);
|
||||
|
||||
char bigBuf [512];
|
||||
memset(bigBuf, '\a', sizeof(bigBuf));
|
||||
bigBuf[ sizeof(bigBuf) - 1] = '\0';
|
||||
et.strftime(buf, sizeof(buf), bigBuf);
|
||||
testOk(strcmp(buf, "<invalid format>") == 0, "bad format => '%s'", buf);
|
||||
}
|
||||
|
||||
{ // invalidFormatTest
|
||||
char bigBuf [512];
|
||||
char buf [32];
|
||||
memset(bigBuf, '\a', sizeof(bigBuf ));
|
||||
bigBuf[ sizeof(bigBuf) - 1] = '\0';
|
||||
begin.strftime(buf, sizeof(buf), bigBuf);
|
||||
testOk(strcmp(buf, "<invalid format>") == 0, "bad format => '%s'", buf);
|
||||
epicsTime now;
|
||||
try {
|
||||
now = epicsTime::getCurrent();
|
||||
testPass("default time provider");
|
||||
}
|
||||
catch ( ... ) {
|
||||
testFail("epicsTime::getCurrent() throws");
|
||||
testAbort("Can't continue, check your time provider");
|
||||
}
|
||||
|
||||
{
|
||||
l_fp ntp = now;
|
||||
epicsTime tsf = ntp;
|
||||
const double diff = fabs(tsf - now);
|
||||
// the difference in the precision of the two time formats
|
||||
static const double precisionNTP = 1.0 / (1.0 + 0xffffffff);
|
||||
testOk1(diff <= precisionEPICS + precisionNTP);
|
||||
}
|
||||
|
||||
testDiag("Running %d loops", nTimes);
|
||||
|
||||
for (int iTimes=0; iTimes < nTimes; ++iTimes) {
|
||||
for (unsigned i=0; i<wasteTime; i++) {
|
||||
useSomeCPU = epicsTime::getCurrent();
|
||||
const epicsTime begin = epicsTime::getCurrent();
|
||||
|
||||
for (int loop = 0; loop < nTimes; ++loop) {
|
||||
for (int i = 0; i < wasteTime; ++i) {
|
||||
now = epicsTime::getCurrent();
|
||||
}
|
||||
|
||||
const epicsTime end = epicsTime::getCurrent();
|
||||
const double diff = end - begin;
|
||||
const double diff = now - begin;
|
||||
|
||||
if (iTimes == 0) {
|
||||
if (loop == 0) {
|
||||
testDiag ("%d calls to epicsTime::getCurrent() "
|
||||
"averaged %6.3f usec each", wasteTime,
|
||||
diff*1e6/wasteTime);
|
||||
diff * 1e6 / wasteTime);
|
||||
}
|
||||
|
||||
epicsTime copy = end;
|
||||
testOk1(copy == end);
|
||||
testOk1(copy <= end);
|
||||
testOk1(copy >= end);
|
||||
epicsTime copy = now;
|
||||
testOk1(copy == now);
|
||||
testOk1(copy <= now);
|
||||
testOk1(copy >= now);
|
||||
|
||||
testOk1(end > begin);
|
||||
testOk1(end >= begin);
|
||||
testOk1(begin != end);
|
||||
testOk1(begin < end);
|
||||
testOk1(begin <= end);
|
||||
testOk1(now > begin);
|
||||
testOk1(now >= begin);
|
||||
testOk1(begin != now);
|
||||
testOk1(begin < now);
|
||||
testOk1(begin <= now);
|
||||
|
||||
testOk1(end - end == 0);
|
||||
testOk(fabs((end - begin) - diff) < precisionEPICS * 0.01,
|
||||
"end - begin ~= diff");
|
||||
testOk1(now - now == 0);
|
||||
testOk(fabs((now - begin) - diff) < precisionEPICS * 0.01,
|
||||
"now - begin ~= diff");
|
||||
|
||||
testOk1(begin + 0 == begin);
|
||||
testOk1(begin + diff == end);
|
||||
testOk1(end - 0 == end);
|
||||
testOk1(end - diff == begin);
|
||||
testOk1(begin + diff == now);
|
||||
testOk1(now - 0 == now);
|
||||
testOk1(now - diff == begin);
|
||||
|
||||
epicsTime end2 = begin;
|
||||
end2 += diff;
|
||||
testOk(end2 == end, "(begin += diff) == end");
|
||||
epicsTime end = begin;
|
||||
end += diff;
|
||||
testOk(end == now, "(begin += diff) == now");
|
||||
|
||||
end2 = end;
|
||||
end2 -= diff;
|
||||
testOk(end2 == begin, "(end -= diff) == begin");
|
||||
end = now;
|
||||
end -= diff;
|
||||
testOk(end == begin, "(now -= diff) == begin");
|
||||
|
||||
// test struct tm round-trip conversion
|
||||
local_tm_nano_sec ansiDate = begin;
|
||||
epicsTime beginANSI = ansiDate;
|
||||
testOk1(beginANSI + diff == end);
|
||||
testOk1(beginANSI + diff == now);
|
||||
|
||||
// test struct timespec round-trip conversion
|
||||
struct timespec ts = begin;
|
||||
epicsTime beginTS = ts;
|
||||
testOk1(beginTS + diff == end);
|
||||
testOk1(beginTS + diff == now);
|
||||
}
|
||||
|
||||
return testDone();
|
||||
|
||||
@@ -21,10 +21,10 @@ $app_top = cwd();
|
||||
|
||||
$bad_ident_chars = '[^0-9A-Za-z_]';
|
||||
|
||||
&GetUser; # Ensure we know who's in charge
|
||||
&readReleaseFiles("configure/RELEASE", \%release, \@apps);
|
||||
&expandRelease(\%release);
|
||||
&get_commandline_opts; # Check command-line options
|
||||
&GetUser; # Ensure we know who's in charge
|
||||
|
||||
#
|
||||
# Declare two default callback routines for file copy plus two
|
||||
@@ -164,7 +164,7 @@ exit 0; # END OF SCRIPT
|
||||
# Get commandline options and check for validity
|
||||
#
|
||||
sub get_commandline_opts { #no args
|
||||
getopts("a:b:dhilp:T:t:") or Cleanup(1);
|
||||
getopts("a:b:dhilp:T:t:u:") or Cleanup(1);
|
||||
|
||||
# Options help
|
||||
Cleanup(0) if $opt_h;
|
||||
@@ -395,7 +395,7 @@ EOF
|
||||
-d Enable debug messages
|
||||
-i Specifies that ioc boot directories will be generated
|
||||
-l List valid application types for this installation
|
||||
If this is specified the other options are not used
|
||||
If this is specified the other options are not used
|
||||
-p app Set the application name for use with -i
|
||||
If not specified, you will be prompted
|
||||
-T top Set the template top directory (where the application templates are)
|
||||
@@ -405,6 +405,7 @@ EOF
|
||||
-t type Set the application type (-l for a list of valid types)
|
||||
If not specified, type is taken from environment
|
||||
If not found in environment, \"default\" is used
|
||||
-u user Set username; overrides OS defaults
|
||||
|
||||
Environment:
|
||||
EPICS_MBA_DEF_APP_TYPE Application type you want to use as default
|
||||
@@ -419,10 +420,7 @@ EOF
|
||||
}
|
||||
|
||||
sub GetUser {
|
||||
# add to this list if new possibilities arise,
|
||||
# currently it's UNIX and WIN32:
|
||||
$user = $ENV{USER} || $ENV{USERNAME} || Win32::LoginName();
|
||||
$user =~ s/\s+//g; # Bl**dy Windows stupidity...
|
||||
$user = $opt_u || $ENV{USER} || $ENV{USERNAME} || Win32::LoginName();
|
||||
|
||||
unless ($user) {
|
||||
print "Strange, I cannot figure out your user name!\n";
|
||||
@@ -430,5 +428,6 @@ sub GetUser {
|
||||
$user = <STDIN>;
|
||||
chomp $user;
|
||||
}
|
||||
$user =~ tr/-a-zA-Z0-9_:;[]<>//cd; # Sanitize; these are the legal chars
|
||||
die "No user name" unless $user;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
/*caMonitor.c*/
|
||||
/* This example accepts a file containing a list of pvs to monitor
|
||||
* It prints a message for all ca evemts: connection, access rights, data
|
||||
|
||||
/* This example accepts the name of a file containing a list of pvs to monitor.
|
||||
* It prints a message for all ca events: connection, access rights and monitor.
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -110,18 +112,18 @@ int main(int argc,char **argv)
|
||||
SEVCHK(ca_context_create(ca_disable_preemptive_callback),"ca_context_create");
|
||||
SEVCHK(ca_add_exception_event(exceptionCallback,NULL),
|
||||
"ca_add_exception_event");
|
||||
for(i=0; i<npv; i++) {
|
||||
for (i=0; i<npv; i++) {
|
||||
SEVCHK(ca_create_channel(pname[i],connectionCallback,
|
||||
pmynode[i],20,&pmynode[i]->mychid),
|
||||
"ca_create_channel");
|
||||
SEVCHK(ca_replace_access_rights_event(pmynode[i]->mychid,
|
||||
accessRightsCallback),
|
||||
"ca_replace_access_rights_event");
|
||||
SEVCHK(ca_add_event(DBR_STRING,pmynode[i]->mychid,eventCallback,
|
||||
pmynode[i],&pmynode[i]->myevid),
|
||||
"ca_add_event");
|
||||
SEVCHK(ca_create_subscription(DBR_STRING,1,pmynode[i]->mychid,
|
||||
DBE_VALUE,eventCallback,pmynode[i],&pmynode[i]->myevid),
|
||||
"ca_create_subscription");
|
||||
}
|
||||
/*Should never return from following call*/
|
||||
SEVCHK(ca_pend_event(0.0),"ca_pend_event");
|
||||
return(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -28,9 +28,9 @@ PYTHON_INCLUDE=/System/Library/Frameworks/Python.framework/Versions/2.3/include/
|
||||
# XDarwin
|
||||
#
|
||||
X11_LIB=/usr/X11R6/lib
|
||||
X11_INC=/usr/X11R6/include/X11
|
||||
X11_INC=/usr/X11R6/include
|
||||
XPM_LIB=/usr/X11R6/lib
|
||||
XPM_INC=/usr/X11R6/include/X11
|
||||
XPM_INC=/usr/X11R6/include
|
||||
|
||||
#
|
||||
# Fink OpenMotif
|
||||
|
||||
@@ -85,13 +85,12 @@ rset aSubRSET = {
|
||||
epicsExportAddress(rset, aSubRSET);
|
||||
|
||||
static long initFields(epicsEnum16 *pft, epicsUInt32 *pno, epicsUInt32 *pne,
|
||||
const char **fldnames, void **pval, void **povl);
|
||||
epicsUInt32 *pon, const char **fldnames, void **pval, void **povl);
|
||||
static long fetch_values(aSubRecord *prec);
|
||||
static void monitor(aSubRecord *);
|
||||
static long do_sub(aSubRecord *);
|
||||
|
||||
#define NUM_ARGS 21
|
||||
#define MAX_ARRAY_SIZE 10000000
|
||||
|
||||
/* These are the names of the Input fields */
|
||||
static const char *Ifldnames[] = {
|
||||
@@ -117,10 +116,10 @@ static long init_record(aSubRecord *prec, int pass)
|
||||
status = 0;
|
||||
if (pass == 0) {
|
||||
/* Allocate memory for arrays */
|
||||
initFields(&prec->fta, &prec->noa, &prec->nea, Ifldnames,
|
||||
&prec->a, NULL);
|
||||
initFields(&prec->ftva, &prec->nova, &prec->neva, Ofldnames,
|
||||
&prec->vala, &prec->ovla);
|
||||
initFields(&prec->fta, &prec->noa, &prec->nea, NULL,
|
||||
Ifldnames, &prec->a, NULL);
|
||||
initFields(&prec->ftva, &prec->nova, &prec->neva, &prec->onva,
|
||||
Ofldnames, &prec->vala, &prec->ovla);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -146,12 +145,8 @@ static long init_record(aSubRecord *prec, int pass)
|
||||
struct link *plink = &(&prec->inpa)[i];
|
||||
switch (plink->type) {
|
||||
case CONSTANT:
|
||||
if ((&prec->noa)[i] < 2) {
|
||||
if (recGblInitConstantLink(plink, (&prec->fta)[i], (&prec->a)[i])) {
|
||||
prec->udf = FALSE;
|
||||
} else
|
||||
prec->udf = TRUE;
|
||||
}
|
||||
if ((&prec->noa)[i] < 2)
|
||||
recGblInitConstantLink(plink, (&prec->fta)[i], (&prec->a)[i]);
|
||||
break;
|
||||
|
||||
case PV_LINK:
|
||||
@@ -218,7 +213,7 @@ static long init_record(aSubRecord *prec, int pass)
|
||||
|
||||
|
||||
static long initFields(epicsEnum16 *pft, epicsUInt32 *pno, epicsUInt32 *pne,
|
||||
const char **fldnames, void **pval, void **povl)
|
||||
epicsUInt32 *pon, const char **fldnames, void **pval, void **povl)
|
||||
{
|
||||
int i;
|
||||
long status = 0;
|
||||
@@ -235,22 +230,16 @@ static long initFields(epicsEnum16 *pft, epicsUInt32 *pno, epicsUInt32 *pne,
|
||||
|
||||
flen = dbValueSize(*pft);
|
||||
num = *pno * flen;
|
||||
|
||||
if (num > MAX_ARRAY_SIZE) {
|
||||
epicsPrintf("Link %s - Array too large! %d Bytes\n", fldnames[i], num);
|
||||
*pno = num = 0;
|
||||
status = S_db_errArg;
|
||||
} else
|
||||
*pval = (char *)callocMustSucceed(*pno, flen,
|
||||
"aSubRecord::init_record");
|
||||
*pval = callocMustSucceed(*pno, flen, "aSubRecord::init_record");
|
||||
|
||||
*pne = *pno;
|
||||
|
||||
if (povl) {
|
||||
if (num)
|
||||
*povl = (char *)callocMustSucceed(*pno, flen,
|
||||
*povl = callocMustSucceed(*pno, flen,
|
||||
"aSubRecord::init_record");
|
||||
povl++;
|
||||
*pon++ = *pne;
|
||||
}
|
||||
}
|
||||
return status;
|
||||
@@ -281,6 +270,7 @@ static long process(aSubRecord *prec)
|
||||
/* Push the output link values */
|
||||
if (!status) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NUM_ARGS; i++)
|
||||
dbPutLink(&(&prec->outa)[i], (&prec->ftva)[i], (&prec->vala)[i],
|
||||
(&prec->neva)[i]);
|
||||
@@ -359,18 +349,29 @@ static void monitor(aSubRecord *prec)
|
||||
break;
|
||||
case aSubEFLG_ON_CHANGE:
|
||||
for (i = 0; i < NUM_ARGS; i++) {
|
||||
epicsUInt32 alen = dbValueSize((&prec->ftva)[i]) * (&prec->neva)[i];
|
||||
void *povl = (&prec->ovla)[i];
|
||||
void *pval = (&prec->vala)[i];
|
||||
if (memcmp(povl, pval, alen)) {
|
||||
epicsUInt32 *ponv = &(&prec->onva)[i];
|
||||
epicsUInt32 *pnev = &(&prec->neva)[i];
|
||||
epicsUInt32 onv = *ponv; /* Num Elements in OVLx */
|
||||
epicsUInt32 nev = *pnev; /* Num Elements in VALx */
|
||||
epicsUInt32 alen = dbValueSize((&prec->ftva)[i]) * nev;
|
||||
|
||||
if (nev != onv || memcmp(povl, pval, alen)) {
|
||||
memcpy(povl, pval, alen);
|
||||
db_post_events(prec, pval, monitor_mask);
|
||||
if (nev != onv) {
|
||||
*ponv = nev;
|
||||
db_post_events(prec, pnev, monitor_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case aSubEFLG_ALWAYS:
|
||||
for (i = 0; i < NUM_ARGS; i++)
|
||||
for (i = 0; i < NUM_ARGS; i++) {
|
||||
db_post_events(prec, (&prec->vala)[i], monitor_mask);
|
||||
db_post_events(prec, &(&prec->neva)[i], monitor_mask);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -1049,127 +1049,148 @@ recordtype(aSub) {
|
||||
prompt("Old Output A")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovla")
|
||||
interest(4)
|
||||
extra("void *ovla")
|
||||
}
|
||||
field(OVLB,DBF_NOACCESS) {
|
||||
prompt("Old Output B")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlb")
|
||||
interest(4)
|
||||
extra("void *ovlb")
|
||||
}
|
||||
field(OVLC,DBF_NOACCESS) {
|
||||
prompt("Old Output C")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlc")
|
||||
interest(4)
|
||||
extra("void *ovlc")
|
||||
}
|
||||
field(OVLD,DBF_NOACCESS) {
|
||||
prompt("Old Output D")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovld")
|
||||
interest(4)
|
||||
extra("void *ovld")
|
||||
}
|
||||
field(OVLE,DBF_NOACCESS) {
|
||||
prompt("Old Output E")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovle")
|
||||
interest(4)
|
||||
extra("void *ovle")
|
||||
}
|
||||
field(OVLF,DBF_NOACCESS) {
|
||||
prompt("Old Output F")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlf")
|
||||
interest(4)
|
||||
extra("void *ovlf")
|
||||
}
|
||||
field(OVLG,DBF_NOACCESS) {
|
||||
prompt("Old Output G")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlg")
|
||||
interest(4)
|
||||
extra("void *ovlg")
|
||||
}
|
||||
field(OVLH,DBF_NOACCESS) {
|
||||
prompt("Old Output H")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlh")
|
||||
interest(4)
|
||||
extra("void *ovlh")
|
||||
}
|
||||
field(OVLI,DBF_NOACCESS) {
|
||||
prompt("Old Output I")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovli")
|
||||
interest(4)
|
||||
extra("void *ovli")
|
||||
}
|
||||
field(OVLJ,DBF_NOACCESS) {
|
||||
prompt("Old Output J")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlj")
|
||||
interest(4)
|
||||
extra("void *ovlj")
|
||||
}
|
||||
field(OVLK,DBF_NOACCESS) {
|
||||
prompt("Old Output K")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlk")
|
||||
interest(4)
|
||||
extra("void *ovlk")
|
||||
}
|
||||
field(OVLL,DBF_NOACCESS) {
|
||||
prompt("Old Output L")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovll")
|
||||
interest(4)
|
||||
extra("void *ovll")
|
||||
}
|
||||
field(OVLM,DBF_NOACCESS) {
|
||||
prompt("Old Output M")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlm")
|
||||
interest(4)
|
||||
extra("void *ovlm")
|
||||
}
|
||||
field(OVLN,DBF_NOACCESS) {
|
||||
prompt("Old Output N")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovln")
|
||||
interest(4)
|
||||
extra("void *ovln")
|
||||
}
|
||||
field(OVLO,DBF_NOACCESS) {
|
||||
prompt("Old Output O")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlo")
|
||||
interest(4)
|
||||
extra("void *ovlo")
|
||||
}
|
||||
field(OVLP,DBF_NOACCESS) {
|
||||
prompt("Old Output P")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlp")
|
||||
interest(4)
|
||||
extra("void *ovlp")
|
||||
}
|
||||
field(OVLQ,DBF_NOACCESS) {
|
||||
prompt("Old Output Q")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlq")
|
||||
interest(4)
|
||||
extra("void *ovlq")
|
||||
}
|
||||
field(OVLR,DBF_NOACCESS) {
|
||||
prompt("Old Output R")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlr")
|
||||
interest(4)
|
||||
extra("void *ovlr")
|
||||
}
|
||||
field(OVLS,DBF_NOACCESS) {
|
||||
prompt("Old Output S")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovls")
|
||||
interest(4)
|
||||
extra("void *ovls")
|
||||
}
|
||||
field(OVLT,DBF_NOACCESS) {
|
||||
prompt("Old Output T")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlt")
|
||||
interest(4)
|
||||
extra("void *ovlt")
|
||||
}
|
||||
field(OVLU,DBF_NOACCESS) {
|
||||
prompt("Old Output U")
|
||||
asl(ASL0)
|
||||
special(SPC_NOMOD)
|
||||
interest(4) extra("void *ovlu")
|
||||
interest(4)
|
||||
extra("void *ovlu")
|
||||
}
|
||||
field(FTVA,DBF_MENU) {
|
||||
prompt("Type of VALA")
|
||||
@@ -1488,149 +1509,254 @@ recordtype(aSub) {
|
||||
}
|
||||
field(NEVA,DBF_ULONG) {
|
||||
prompt("Num. elements in VALA")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVB,DBF_ULONG) {
|
||||
prompt("Num. elements in VALB")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVC,DBF_ULONG) {
|
||||
prompt("Num. elements in VALC")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVD,DBF_ULONG) {
|
||||
prompt("Num. elements in VALD")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVE,DBF_ULONG) {
|
||||
prompt("Num. elements in VALE")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVF,DBF_ULONG) {
|
||||
prompt("Num. elements in VALF")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVG,DBF_ULONG) {
|
||||
prompt("Num. elements in VALG")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVH,DBF_ULONG) {
|
||||
prompt("Num. elements in VAlH")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVI,DBF_ULONG) {
|
||||
prompt("Num. elements in VALI")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVJ,DBF_ULONG) {
|
||||
prompt("Num. elements in VALJ")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVK,DBF_ULONG) {
|
||||
prompt("Num. elements in VALK")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVL,DBF_ULONG) {
|
||||
prompt("Num. elements in VALL")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVM,DBF_ULONG) {
|
||||
prompt("Num. elements in VALM")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVN,DBF_ULONG) {
|
||||
prompt("Num. elements in VALN")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVO,DBF_ULONG) {
|
||||
prompt("Num. elements in VALO")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVP,DBF_ULONG) {
|
||||
prompt("Num. elements in VALP")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVQ,DBF_ULONG) {
|
||||
prompt("Num. elements in VALQ")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVR,DBF_ULONG) {
|
||||
prompt("Num. elements in VALR")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVS,DBF_ULONG) {
|
||||
prompt("Num. elements in VALS")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVT,DBF_ULONG) {
|
||||
prompt("Num. elements in VALT")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(NEVU,DBF_ULONG) {
|
||||
prompt("Num. elements in VALU")
|
||||
promptgroup(GUI_WAVE)
|
||||
special(SPC_NOMOD)
|
||||
interest(3)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVA,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLA")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVB,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLB")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVC,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLC")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVD,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLD")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVE,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLE")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVF,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLF")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVG,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLG")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVH,DBF_ULONG) {
|
||||
prompt("Num. elements in VAlH")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVI,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLI")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVJ,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLJ")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVK,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLK")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVL,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLL")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVM,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLM")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVN,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLN")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVO,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLO")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVP,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLP")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVQ,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLQ")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVR,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLR")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVS,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLS")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVT,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLT")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
field(ONVU,DBF_ULONG) {
|
||||
prompt("Num. elements in OVLU")
|
||||
special(SPC_NOMOD)
|
||||
interest(4)
|
||||
initial("1")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -385,7 +385,7 @@ static void monitor(aiRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -395,7 +395,7 @@ static void monitor(aiRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -484,7 +484,7 @@ static void monitor(aoRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -493,7 +493,7 @@ static void monitor(aoRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -310,7 +310,7 @@ static void monitor(calcRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -319,7 +319,7 @@ static void monitor(calcRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -209,7 +209,7 @@ static long init_record(calcoutRecord *prec, int pass)
|
||||
static long process(calcoutRecord *prec)
|
||||
{
|
||||
rpvtStruct *prpvt = prec->rpvt;
|
||||
int doOutput = 0;
|
||||
int doOutput;
|
||||
|
||||
if (!prec->pact) {
|
||||
prec->pact = TRUE;
|
||||
@@ -231,27 +231,29 @@ static long process(calcoutRecord *prec)
|
||||
doOutput = 1;
|
||||
break;
|
||||
case calcoutOOPT_On_Change:
|
||||
if (fabs(prec->pval - prec->val) > prec->mdel) doOutput = 1;
|
||||
doOutput = ! (fabs(prec->pval - prec->val) <= prec->mdel);
|
||||
break;
|
||||
case calcoutOOPT_Transition_To_Zero:
|
||||
if ((prec->pval != 0.0) && (prec->val == 0.0)) doOutput = 1;
|
||||
doOutput = ((prec->pval != 0.0) && (prec->val == 0.0));
|
||||
break;
|
||||
case calcoutOOPT_Transition_To_Non_zero:
|
||||
if ((prec->pval == 0.0) && (prec->val != 0.0)) doOutput = 1;
|
||||
doOutput = ((prec->pval == 0.0) && (prec->val != 0.0));
|
||||
break;
|
||||
case calcoutOOPT_When_Zero:
|
||||
if (prec->val == 0.0) doOutput = 1;
|
||||
doOutput = (prec->val == 0.0);
|
||||
break;
|
||||
case calcoutOOPT_When_Non_zero:
|
||||
if (prec->val != 0.0) doOutput = 1;
|
||||
doOutput = (prec->val != 0.0);
|
||||
break;
|
||||
default:
|
||||
doOutput = 0;
|
||||
break;
|
||||
}
|
||||
prec->pval = prec->val;
|
||||
if (doOutput) {
|
||||
if (prec->odly > 0.0) {
|
||||
prec->dlya = 1;
|
||||
recGblGetTimeStamp(prec);
|
||||
db_post_events(prec, &prec->dlya, DBE_VALUE);
|
||||
callbackRequestProcessCallbackDelayed(&prpvt->doOutCb,
|
||||
prec->prio, prec, (double)prec->odly);
|
||||
@@ -263,9 +265,11 @@ static long process(calcoutRecord *prec)
|
||||
prec->pact = TRUE;
|
||||
}
|
||||
}
|
||||
recGblGetTimeStamp(prec);
|
||||
} else { /* pact == TRUE */
|
||||
if (prec->dlya) {
|
||||
prec->dlya = 0;
|
||||
recGblGetTimeStamp(prec);
|
||||
db_post_events(prec, &prec->dlya, DBE_VALUE);
|
||||
/* Make pact FALSE for asynchronous device support*/
|
||||
prec->pact = FALSE;
|
||||
@@ -274,9 +278,9 @@ static long process(calcoutRecord *prec)
|
||||
prec->pact = TRUE;
|
||||
} else {/*Device Support is asynchronous*/
|
||||
writeValue(prec);
|
||||
recGblGetTimeStamp(prec);
|
||||
}
|
||||
}
|
||||
recGblGetTimeStamp(prec);
|
||||
monitor(prec);
|
||||
recGblFwdLink(prec);
|
||||
prec->pact = FALSE;
|
||||
@@ -581,7 +585,7 @@ static void monitor(calcoutRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if (delta<0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -590,7 +594,7 @@ static void monitor(calcoutRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if (delta<0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -267,7 +267,7 @@ static void monitor(dfanoutRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if(delta<0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -276,7 +276,7 @@ static void monitor(dfanoutRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if(delta<0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -300,7 +300,7 @@ static void monitor(selRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->mlst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -309,7 +309,7 @@ static void monitor(selRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->alst - prec->val;
|
||||
if(delta<0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -90,8 +90,6 @@ typedef struct callbackSeq {
|
||||
int index;
|
||||
}callbackSeq;
|
||||
|
||||
int processNextLink();
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
@@ -327,7 +325,9 @@ static long asyncFinish(seqRecord *prec)
|
||||
if (seqRecDebug > 5)
|
||||
printf("asyncFinish(%s) completing processing\n", prec->name);
|
||||
prec->udf = FALSE;
|
||||
|
||||
|
||||
recGblGetTimeStamp(prec);
|
||||
|
||||
MonitorMask = recGblResetAlarms(prec);
|
||||
|
||||
if (MonitorMask)
|
||||
@@ -336,8 +336,6 @@ static long asyncFinish(seqRecord *prec)
|
||||
/* process the forward scan link record */
|
||||
recGblFwdLink(prec);
|
||||
|
||||
recGblGetTimeStamp(prec);
|
||||
/* tsLocalTime(&prec->time); */
|
||||
prec->pact = FALSE;
|
||||
|
||||
return(0);
|
||||
@@ -377,6 +375,8 @@ static void processCallback(CALLBACK *arg)
|
||||
dbGetLink(&(pcb->plinks[pcb->index]->dol), DBR_DOUBLE,
|
||||
&(pcb->plinks[pcb->index]->dov),0,0);
|
||||
|
||||
recGblGetTimeStamp(prec);
|
||||
|
||||
/* Dump the value to the destination field */
|
||||
dbPutLink(&(pcb->plinks[pcb->index]->lnk), DBR_DOUBLE,
|
||||
&(pcb->plinks[pcb->index]->dov),1);
|
||||
|
||||
@@ -156,20 +156,20 @@ static long process(stringinRecord *prec)
|
||||
|
||||
static void monitor(stringinRecord *prec)
|
||||
{
|
||||
unsigned short monitor_mask;
|
||||
int monitor_mask = recGblResetAlarms(prec);
|
||||
|
||||
monitor_mask = recGblResetAlarms(prec);
|
||||
if(strcmp(prec->oval,prec->val)) {
|
||||
monitor_mask |= DBE_VALUE|DBE_LOG;
|
||||
strcpy(prec->oval,prec->val);
|
||||
if (strncmp(prec->oval, prec->val, sizeof(prec->val))) {
|
||||
monitor_mask |= DBE_VALUE | DBE_LOG;
|
||||
strncpy(prec->oval, prec->val, sizeof(prec->val));
|
||||
}
|
||||
|
||||
if (prec->mpst == stringinPOST_Always)
|
||||
monitor_mask |= DBE_VALUE;
|
||||
monitor_mask |= DBE_VALUE;
|
||||
if (prec->apst == stringinPOST_Always)
|
||||
monitor_mask |= DBE_LOG;
|
||||
if(monitor_mask)
|
||||
db_post_events(prec,&(prec->val[0]),monitor_mask);
|
||||
return;
|
||||
monitor_mask |= DBE_LOG;
|
||||
|
||||
if (monitor_mask)
|
||||
db_post_events(prec, prec->val, monitor_mask);
|
||||
}
|
||||
|
||||
static long readValue(stringinRecord *prec)
|
||||
|
||||
@@ -184,20 +184,20 @@ static long process(stringoutRecord *prec)
|
||||
|
||||
static void monitor(stringoutRecord *prec)
|
||||
{
|
||||
unsigned short monitor_mask;
|
||||
int monitor_mask = recGblResetAlarms(prec);
|
||||
|
||||
monitor_mask = recGblResetAlarms(prec);
|
||||
if(strcmp(prec->oval,prec->val)) {
|
||||
monitor_mask |= DBE_VALUE|DBE_LOG;
|
||||
strcpy(prec->oval,prec->val);
|
||||
if (strncmp(prec->oval, prec->val, sizeof(prec->val))) {
|
||||
monitor_mask |= DBE_VALUE | DBE_LOG;
|
||||
strncpy(prec->oval, prec->val, sizeof(prec->val));
|
||||
}
|
||||
|
||||
if (prec->mpst == stringoutPOST_Always)
|
||||
monitor_mask |= DBE_VALUE;
|
||||
monitor_mask |= DBE_VALUE;
|
||||
if (prec->apst == stringoutPOST_Always)
|
||||
monitor_mask |= DBE_LOG;
|
||||
if(monitor_mask)
|
||||
db_post_events(prec,&(prec->val[0]),monitor_mask);
|
||||
return;
|
||||
monitor_mask |= DBE_LOG;
|
||||
|
||||
if (monitor_mask)
|
||||
db_post_events(prec, prec->val, monitor_mask);
|
||||
}
|
||||
|
||||
static long writeValue(stringoutRecord *prec)
|
||||
|
||||
@@ -353,7 +353,7 @@ static void monitor(subRecord *prec)
|
||||
/* check for value change */
|
||||
delta = prec->val - prec->mlst;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->mdel) {
|
||||
if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
|
||||
/* post events for value change */
|
||||
monitor_mask |= DBE_VALUE;
|
||||
/* update last value monitored */
|
||||
@@ -362,7 +362,7 @@ static void monitor(subRecord *prec)
|
||||
/* check for archive change */
|
||||
delta = prec->val - prec->alst;
|
||||
if (delta < 0.0) delta = -delta;
|
||||
if (delta > prec->adel) {
|
||||
if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
|
||||
/* post events on value field for archive change */
|
||||
monitor_mask |= DBE_LOG;
|
||||
/* update last archive value monitored */
|
||||
|
||||
@@ -13,8 +13,6 @@
|
||||
* Date: 2004-03-19
|
||||
*/
|
||||
|
||||
#include "dbBase.h"
|
||||
#include "shareLib.h"
|
||||
#include "errlog.h"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
@@ -24,16 +22,16 @@
|
||||
|
||||
|
||||
void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
const char* const* recordTypeNames, const recordTypeLocation *rtl)
|
||||
const char * const *recordTypeNames, const recordTypeLocation *rtl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nRecordTypes; i++) {
|
||||
for (i = 0; i < nRecordTypes; i++) {
|
||||
recordTypeLocation *precordTypeLocation;
|
||||
computeSizeOffset sizeOffset;
|
||||
DBENTRY dbEntry;
|
||||
|
||||
if(registryRecordTypeFind(recordTypeNames[i])) continue;
|
||||
if(!registryRecordTypeAdd(recordTypeNames[i],&rtl[i])) {
|
||||
if (registryRecordTypeFind(recordTypeNames[i])) continue;
|
||||
if (!registryRecordTypeAdd(recordTypeNames[i], &rtl[i])) {
|
||||
errlogPrintf("registryRecordTypeAdd failed %s\n",
|
||||
recordTypeNames[i]);
|
||||
continue;
|
||||
@@ -41,7 +39,7 @@ void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
dbInitEntry(pbase,&dbEntry);
|
||||
precordTypeLocation = registryRecordTypeFind(recordTypeNames[i]);
|
||||
sizeOffset = precordTypeLocation->sizeOffset;
|
||||
if(dbFindRecordType(&dbEntry,recordTypeNames[i])) {
|
||||
if (dbFindRecordType(&dbEntry, recordTypeNames[i])) {
|
||||
errlogPrintf("registerRecordDeviceDriver failed %s\n",
|
||||
recordTypeNames[i]);
|
||||
} else {
|
||||
@@ -51,12 +49,12 @@ void epicsShareAPI registerRecordTypes(DBBASE *pbase, int nRecordTypes,
|
||||
}
|
||||
|
||||
void epicsShareAPI registerDevices(DBBASE *pbase, int nDevices,
|
||||
const char* const* deviceSupportNames, const dset* const* devsl)
|
||||
const char * const *deviceSupportNames, const dset * const *devsl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nDevices; i++) {
|
||||
if(registryDeviceSupportFind(deviceSupportNames[i])) continue;
|
||||
if(!registryDeviceSupportAdd(deviceSupportNames[i],devsl[i])) {
|
||||
for (i = 0; i < nDevices; i++) {
|
||||
if (registryDeviceSupportFind(deviceSupportNames[i])) continue;
|
||||
if (!registryDeviceSupportAdd(deviceSupportNames[i], devsl[i])) {
|
||||
errlogPrintf("registryDeviceSupportAdd failed %s\n",
|
||||
deviceSupportNames[i]);
|
||||
continue;
|
||||
@@ -65,12 +63,12 @@ void epicsShareAPI registerDevices(DBBASE *pbase, int nDevices,
|
||||
}
|
||||
|
||||
void epicsShareAPI registerDrivers(DBBASE *pbase, int nDrivers,
|
||||
const char* const* driverSupportNames, struct drvet* const* drvsl)
|
||||
const char * const * driverSupportNames, struct drvet * const *drvsl)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< nDrivers; i++) {
|
||||
if(registryDriverSupportFind(driverSupportNames[i])) continue;
|
||||
if(!registryDriverSupportAdd(driverSupportNames[i], drvsl[i])) {
|
||||
for (i = 0; i < nDrivers; i++) {
|
||||
if (registryDriverSupportFind(driverSupportNames[i])) continue;
|
||||
if (!registryDriverSupportAdd(driverSupportNames[i], drvsl[i])) {
|
||||
errlogPrintf("registryDriverSupportAdd failed %s\n",
|
||||
driverSupportNames[i]);
|
||||
continue;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user