Compare commits
5 Commits
PSI-7.0.8.
...
PSI-7.0.8.
| Author | SHA1 | Date | |
|---|---|---|---|
| 6bb78e0d59 | |||
| 7d73932dc8 | |||
| 4a442bb56c | |||
| 60075df3cf | |||
| 42892f3921 |
@@ -8,7 +8,7 @@
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Unix valid build types
|
||||
VALID_BUILDS = Host Ioc Command
|
||||
VALID_BUILDS = $(if $(filter HOST,$(BUILD_CLASS)),Host) Ioc Command
|
||||
|
||||
#-------------------------------------------------------
|
||||
# Unix prefix and suffix definitions
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
# Cross Debian 10 with gcc 8.3
|
||||
# Debian 10
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
|
||||
|
||||
ARCH_CLASS = x86_64
|
||||
|
||||
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
|
||||
GNU_TARGET = x86_64-deb10-linux-gnu
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
STD_CXXFLAGS = -std=c++17
|
||||
|
||||
ifneq ($(EPICS_HOST_ARCH),$(T_A))
|
||||
# Cross compile
|
||||
GNU_DIR = /opt/xgcc/gcc-8.3.0-deb10
|
||||
GNU_TARGET = x86_64-deb10-linux-gnu
|
||||
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
|
||||
CMPLR_PREFIX = $(GNU_TARGET)-
|
||||
endif
|
||||
|
||||
17
configure/os/CONFIG.Common.deb12-x86_64
Normal file
17
configure/os/CONFIG.Common.deb12-x86_64
Normal file
@@ -0,0 +1,17 @@
|
||||
# Debian 12
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
STD_CXXFLAGS = -std=c++17
|
||||
|
||||
ifneq ($(EPICS_HOST_ARCH),$(T_A))
|
||||
# Cross compile
|
||||
GNU_DIR = /opt/xgcc/gcc-12.2.0-deb12
|
||||
GNU_TARGET = x86_64-deb12-linux-gnu
|
||||
SYSROOT = $(GNU_DIR)/$(GNU_TARGET)/sys-root
|
||||
CMPLR_PREFIX = $(GNU_TARGET)-
|
||||
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(SYSROOT)/lib/x86_64-linux-gnu
|
||||
endif
|
||||
3
configure/os/CONFIG.deb10-x86_64.Common
Normal file
3
configure/os/CONFIG.deb10-x86_64.Common
Normal file
@@ -0,0 +1,3 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
3
configure/os/CONFIG.deb10-x86_64.deb10-x86_64
Normal file
3
configure/os/CONFIG.deb10-x86_64.deb10-x86_64
Normal file
@@ -0,0 +1,3 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
GNU_DIR=/usr
|
||||
3
configure/os/CONFIG.deb12-x86_64.Common
Normal file
3
configure/os/CONFIG.deb12-x86_64.Common
Normal file
@@ -0,0 +1,3 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
3
configure/os/CONFIG.deb12-x86_64.deb12-x86_64
Normal file
3
configure/os/CONFIG.deb12-x86_64.deb12-x86_64
Normal file
@@ -0,0 +1,3 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
GNU_DIR=/usr
|
||||
2
configure/os/CONFIG_SITE.Common.deb12-x86_64
Normal file
2
configure/os/CONFIG_SITE.Common.deb12-x86_64
Normal file
@@ -0,0 +1,2 @@
|
||||
# Debian 10
|
||||
COMMANDLINE_LIBRARY=READLINE
|
||||
@@ -18,10 +18,6 @@ GNU_DIR = $(SYSROOT)$(TOOLSET_DIR)
|
||||
TARGET_CPPFLAGS += $(SYSROOT:%=--sysroot=%)
|
||||
TARGET_LDFLAGS += $(SYSROOT:%=--sysroot=%)
|
||||
|
||||
ifeq ($(filter SL% RHEL%,$(T_A)),)
|
||||
VALID_BUILDS = Ioc Command
|
||||
endif
|
||||
|
||||
# backward compatibility: Keep unversioned libs
|
||||
# in order to prevent dynamic linking problems
|
||||
# when minor changes increment *_MAINTENANCE_VERSION
|
||||
|
||||
@@ -21,8 +21,9 @@ CROSS_COMPILER_TARGET_ARCHS += windows-x64
|
||||
#CROSS_COMPILER_TARGET_ARCHS += yocto21-aarch64
|
||||
CROSS_COMPILER_TARGET_ARCHS += yocto40-aarch64
|
||||
|
||||
# Debian 10
|
||||
# Debian
|
||||
CROSS_COMPILER_TARGET_ARCHS += deb10-x86_64
|
||||
CROSS_COMPILER_TARGET_ARCHS += deb12-x86_64
|
||||
|
||||
# Newer DeltaTau PowerPMAC
|
||||
CROSS_COMPILER_TARGET_ARCHS += gcc8-ppc4xxFP
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
Name: epics-base-%{EpicsVersion}
|
||||
Summary: EPICS Base %{EpicsVersion}
|
||||
Version: 2
|
||||
Release: 1%{?dist}
|
||||
Release: 2%{?dist}
|
||||
License: EPICS Open License
|
||||
Group: Development/Languages
|
||||
URL: https://git.psi.ch/epics_base/base-7.0
|
||||
@@ -334,19 +334,52 @@ fi
|
||||
###########################################
|
||||
|
||||
%files boot
|
||||
# including files to build on some Linux cross archs
|
||||
# hence some configure/* and lib/perl/* listed twice
|
||||
%defattr(-,root,root,-)
|
||||
%dir %{prog_folder}
|
||||
%dir %{prog_folder}/configure
|
||||
%{prog_folder}/configure/CONFIG_BASE_VERSION
|
||||
%{prog_folder}/configure/RELEASE
|
||||
%{prog_folder}/configure/CONFIG*
|
||||
%{prog_folder}/configure/RULES*
|
||||
%dir %{prog_folder}/configure/os
|
||||
%{prog_folder}/configure/os/CONFIG.Common.UnixCommon
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linuxCommon
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linux-clang
|
||||
%{prog_folder}/configure/os/CONFIG.Common.linux-%{_host_cpu}*
|
||||
%{prog_folder}/configure/os/CONFIG.Common.[a-z]*-*
|
||||
%{prog_folder}/configure/os/CONFIG.UnixCommon.Common
|
||||
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG.[a-z]*-*.[a-z]*-*
|
||||
%{prog_folder}/configure/os/CONFIG.linux-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG.linux-*.linux-*
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.Common.linuxCommon
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.Common.linux-*
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.[a-z]*-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.Common
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.UnixCommon
|
||||
%{prog_folder}/configure/os/CONFIG_SITE.linux-*.linux-*
|
||||
|
||||
%dir %{prog_folder}/include
|
||||
%{prog_folder}/include/*.h
|
||||
%{prog_folder}/include/compiler
|
||||
%dir %{prog_folder}/include/os
|
||||
%{prog_folder}/include/os/Linux/
|
||||
%{prog_folder}/include/pv/
|
||||
%{prog_folder}/include/pva/
|
||||
%{prog_folder}/include/valgrind/
|
||||
%{prog_folder}/include/flex.skel.static
|
||||
|
||||
%dir %{prog_folder}/dbd
|
||||
%{prog_folder}/dbd/softIoc*.dbd
|
||||
%{prog_folder}/db
|
||||
|
||||
%dir %{prog_folder}/lib
|
||||
# avoid pulling in pkgconfig and perl
|
||||
%dir %{prog_folder}/lib/[a-z]*-*
|
||||
%{prog_folder}/lib/[a-z]*-*/*.so*
|
||||
%dir %{prog_folder}/lib/perl
|
||||
%{prog_folder}/lib/perl/EPICS
|
||||
%{prog_folder}/lib/perl/DBD*
|
||||
|
||||
%dir %{prog_folder}/bin
|
||||
# avoid pulling in host files again
|
||||
@@ -354,9 +387,11 @@ fi
|
||||
# including all Windows dlls (hence listed twice: here and in wine)
|
||||
%dir %{prog_folder}/bin/[a-z]*
|
||||
%{prog_folder}/bin/[a-z]*/[Scips]*[^.]??
|
||||
%{prog_folder}/bin/[a-z]*/p2p
|
||||
%{prog_folder}/bin/[a-z]*/msi*
|
||||
%{prog_folder}/bin/[a-z]*/acctst*
|
||||
%{prog_folder}/bin/[a-z]*/*.dll
|
||||
%{prog_folder}/bin/[a-z]*/registerRecordDeviceDriver*
|
||||
|
||||
# vxWorks and RTEMS
|
||||
%dir %{prog_folder}/bin/V*
|
||||
|
||||
@@ -302,6 +302,16 @@ static long get_outlinkNumber(int fieldIndex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define do_recursion_safe(func, plink, ...) \
|
||||
do { \
|
||||
dbScanLock((dbCommon*)prec); \
|
||||
DBLINK link = *(plink); \
|
||||
(plink)->lset = NULL; \
|
||||
func(&link, __VA_ARGS__); \
|
||||
(plink)->lset = link.lset; \
|
||||
dbScanUnlock((dbCommon*)prec); \
|
||||
} while(0)
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
@@ -309,12 +319,12 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
|
||||
linkNumber = get_inlinkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0) {
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0) {
|
||||
dbGetUnits(&prec->outa + linkNumber, units, DB_UNITS_SIZE);
|
||||
do_recursion_safe(dbGetUnits, &prec->outa + linkNumber, units, DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -322,27 +332,25 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
aSubRecord *prec = (aSubRecord *)paddr->precord;
|
||||
long status;
|
||||
int fieldIndex = dbGetFieldIndex(paddr);
|
||||
int linkNumber;
|
||||
short precision;
|
||||
|
||||
*pprecision = prec->prec;
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
short precision;
|
||||
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
short precision;
|
||||
|
||||
if (dbGetPrecision(&prec->outa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
do_recursion_safe(status = dbGetPrecision, &prec->outa + linkNumber, &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -354,16 +362,16 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->outa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
do_recursion_safe(dbGetGraphicLimits, &prec->outa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -382,20 +390,20 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
|
||||
linkNumber = get_inlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
return 0;
|
||||
}
|
||||
linkNumber = get_outlinkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->outa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
do_recursion_safe(dbGetAlarmLimits, &prec->outa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
return 0;
|
||||
}
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
|
||||
@@ -166,6 +166,16 @@ static long get_linkNumber(int fieldIndex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define do_recursion_safe(func, plink, ...) \
|
||||
do { \
|
||||
dbScanLock((dbCommon*)prec); \
|
||||
DBLINK link = *(plink); \
|
||||
(plink)->lset = NULL; \
|
||||
func(&link, __VA_ARGS__); \
|
||||
(plink)->lset = link.lset; \
|
||||
dbScanUnlock((dbCommon*)prec); \
|
||||
} while(0)
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
calcRecord *prec = (calcRecord *)paddr->precord;
|
||||
@@ -174,7 +184,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
@@ -193,10 +203,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
long status;
|
||||
short precision;
|
||||
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
@@ -222,11 +232,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return 0;
|
||||
@@ -267,13 +277,13 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
} else {
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -413,6 +413,16 @@ static long get_linkNumber(int fieldIndex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define do_recursion_safe(func, plink, ...) \
|
||||
do { \
|
||||
dbScanLock((dbCommon*)prec); \
|
||||
DBLINK link = *(plink); \
|
||||
(plink)->lset = NULL; \
|
||||
func(&link, __VA_ARGS__); \
|
||||
(plink)->lset = link.lset; \
|
||||
dbScanUnlock((dbCommon*)prec); \
|
||||
} while(0)
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
calcoutRecord *prec = (calcoutRecord *)paddr->precord;
|
||||
@@ -425,9 +435,9 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
}
|
||||
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
@@ -451,10 +461,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
long status;
|
||||
short precision;
|
||||
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
@@ -484,11 +494,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return 0;
|
||||
@@ -533,13 +543,13 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
} else {
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -279,39 +279,49 @@ static void processCallback(epicsCallback *arg)
|
||||
#define get_dol(prec, fieldOffset) \
|
||||
&((linkGrp *) &prec->dly0)[fieldOffset >> 2].dol
|
||||
|
||||
#define do_recursion_safe(func, plink, ...) \
|
||||
do { \
|
||||
dbScanLock((dbCommon*)prec); \
|
||||
DBLINK link = *(plink); \
|
||||
(plink)->lset = NULL; \
|
||||
func(&link, __VA_ARGS__); \
|
||||
(plink)->lset = link.lset; \
|
||||
dbScanUnlock((dbCommon*)prec); \
|
||||
} while(0)
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
strcpy(units, "s");
|
||||
break;
|
||||
case 2: /* DOn */
|
||||
dbGetUnits(get_dol(prec, fieldOffset),
|
||||
units, DB_UNITS_SIZE);
|
||||
}
|
||||
do_recursion_safe(dbGetUnits, get_dol(prec, fieldOffset),
|
||||
units, DB_UNITS_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
long status;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
short precision;
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
*pprecision = seqDLYprecision;
|
||||
return 0;
|
||||
case 2: /* DOn */
|
||||
if (dbGetPrecision(get_dol(prec, fieldOffset), &precision) == 0) {
|
||||
*pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
do_recursion_safe(status = dbGetPrecision, get_dol(prec, fieldOffset), &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
return 0;
|
||||
}
|
||||
*pprecision = prec->prec;
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
@@ -321,18 +331,18 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0)
|
||||
switch (fieldOffset & 2) {
|
||||
switch (fieldOffset & 3) {
|
||||
case 0: /* DLYn */
|
||||
pgd->lower_disp_limit = 0.0;
|
||||
pgd->lower_disp_limit = 10.0;
|
||||
pgd->upper_disp_limit = 10.0;
|
||||
return 0;
|
||||
case 2: /* DOn */
|
||||
dbGetGraphicLimits(get_dol(prec, fieldOffset),
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
do_recursion_safe(dbGetGraphicLimits, get_dol(prec, fieldOffset),
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
return 0;
|
||||
}
|
||||
recGblGetGraphicDouble(paddr, pgd);
|
||||
@@ -341,9 +351,9 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
|
||||
static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
{
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 0) { /* DLYn */
|
||||
if (fieldOffset >= 0 && (fieldOffset & 3) == 0) { /* DLYn */
|
||||
pcd->lower_ctrl_limit = 0.0;
|
||||
pcd->upper_ctrl_limit = seqDLYlimit;
|
||||
}
|
||||
@@ -355,12 +365,12 @@ static long get_control_double(DBADDR *paddr, struct dbr_ctrlDouble *pcd)
|
||||
static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
seqRecord *prec = (seqRecord *) paddr->precord;
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY1);
|
||||
int fieldOffset = dbGetFieldIndex(paddr) - indexof(DLY0);
|
||||
|
||||
if (fieldOffset >= 0 && (fieldOffset & 2) == 2) /* DOn */
|
||||
dbGetAlarmLimits(get_dol(prec, fieldOffset),
|
||||
&pad->lower_alarm_limit, &pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit, &pad->upper_alarm_limit);
|
||||
if (fieldOffset >= 0 && (fieldOffset & 3) == 2) /* DOn */
|
||||
do_recursion_safe(dbGetAlarmLimits, get_dol(prec, fieldOffset),
|
||||
&pad->lower_alarm_limit, &pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit, &pad->upper_alarm_limit);
|
||||
else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
return 0;
|
||||
|
||||
@@ -201,6 +201,16 @@ static long get_linkNumber(int fieldIndex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define do_recursion_safe(func, plink, ...) \
|
||||
do { \
|
||||
dbScanLock((dbCommon*)prec); \
|
||||
DBLINK link = *(plink); \
|
||||
(plink)->lset = NULL; \
|
||||
func(&link, __VA_ARGS__); \
|
||||
(plink)->lset = link.lset; \
|
||||
dbScanUnlock((dbCommon*)prec); \
|
||||
} while(0)
|
||||
|
||||
static long get_units(DBADDR *paddr, char *units)
|
||||
{
|
||||
subRecord *prec = (subRecord *)paddr->precord;
|
||||
@@ -209,7 +219,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
if(paddr->pfldDes->field_type == DBF_DOUBLE) {
|
||||
linkNumber = get_linkNumber(dbGetFieldIndex(paddr));
|
||||
if (linkNumber >= 0)
|
||||
dbGetUnits(&prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
do_recursion_safe(dbGetUnits, &prec->inpa + linkNumber, units, DB_UNITS_SIZE);
|
||||
else
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
}
|
||||
@@ -228,10 +238,10 @@ static long get_precision(const DBADDR *paddr, long *pprecision)
|
||||
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
long status;
|
||||
short precision;
|
||||
|
||||
if (dbGetPrecision(&prec->inpa + linkNumber, &precision) == 0)
|
||||
*pprecision = precision;
|
||||
do_recursion_safe(status = dbGetPrecision, &prec->inpa + linkNumber, &precision);
|
||||
if (status == 0) *pprecision = precision;
|
||||
} else
|
||||
recGblGetPrec(paddr, pprecision);
|
||||
return 0;
|
||||
@@ -257,11 +267,11 @@ static long get_graphic_double(DBADDR *paddr, struct dbr_grDouble *pgd)
|
||||
break;
|
||||
default:
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetGraphicLimits(&prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
} else
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetGraphicLimits, &prec->inpa + linkNumber,
|
||||
&pgd->lower_disp_limit,
|
||||
&pgd->upper_disp_limit);
|
||||
else
|
||||
recGblGetGraphicDouble(paddr,pgd);
|
||||
}
|
||||
return 0;
|
||||
@@ -302,14 +312,14 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
} else {
|
||||
linkNumber = get_linkNumber(fieldIndex);
|
||||
if (linkNumber >= 0) {
|
||||
dbGetAlarmLimits(&prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
} else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
if (linkNumber >= 0)
|
||||
do_recursion_safe(dbGetAlarmLimits, &prec->inpa + linkNumber,
|
||||
&pad->lower_alarm_limit,
|
||||
&pad->lower_warning_limit,
|
||||
&pad->upper_warning_limit,
|
||||
&pad->upper_alarm_limit);
|
||||
else
|
||||
recGblGetAlarmDouble(paddr, pad);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user