From 16bc2318ad3c66799b8a1479ff9699a80987ab55 Mon Sep 17 00:00:00 2001
From: sailer <sailer>
Date: Mon, 19 May 2003 11:01:55 +0000
Subject: [PATCH] Simplify pas and make it EPICS 3.14-ready. fist part. 	--
 Benjamin Sailer

---
 allParam/Makefile.am                      |   1 -
 allParam/Makefile.in                      |  22 +--
 allParam/ca/server/paramBlobRecord.cc     |  34 +++--
 allParam/ca/server/paramBlobRecord.h      |  13 +-
 allParam/ca/server/paramFilenameRecord.cc |  34 +++--
 allParam/ca/server/paramFilenameRecord.h  |  13 +-
 allParam/ca/server/paramIntRecord.cc      |  34 +++--
 allParam/ca/server/paramIntRecord.h       |  13 +-
 allParam/ca/server/paramRecord.cc         | 110 -------------
 allParam/ca/server/paramRecord.h          |  45 ------
 allParam/ca/server/paramRecordSet.h       |   2 +-
 allParam/ca/server/paramServer.cc         | 116 ++++++++++++--
 allParam/ca/server/paramStringRecord.cc   |  34 +++--
 allParam/ca/server/paramStringRecord.h    |  13 +-
 allParam/ca/server/record.cc              | 178 +++++++++++++++++-----
 allParam/ca/server/record.h               |  57 ++++++-
 16 files changed, 429 insertions(+), 290 deletions(-)
 delete mode 100644 allParam/ca/server/paramRecord.cc
 delete mode 100644 allParam/ca/server/paramRecord.h

diff --git a/allParam/Makefile.am b/allParam/Makefile.am
index 556d3ae..fb757ec 100644
--- a/allParam/Makefile.am
+++ b/allParam/Makefile.am
@@ -48,7 +48,6 @@ pas_SOURCES = ca/server/arrayDest.cc
 pas_SOURCES += ca/server/paramBlobRecord.cc
 pas_SOURCES += ca/server/paramFilenameRecord.cc
 pas_SOURCES += ca/server/paramIntRecord.cc
-pas_SOURCES += ca/server/paramRecord.cc
 pas_SOURCES += ca/server/paramRecordSet.cc
 pas_SOURCES += ca/server/paramStringRecord.cc
 pas_SOURCES += ca/server/record.cc
diff --git a/allParam/Makefile.in b/allParam/Makefile.in
index f7c9885..ac3b87a 100644
--- a/allParam/Makefile.in
+++ b/allParam/Makefile.in
@@ -118,7 +118,7 @@ liboraParam_p_a_CFLAGS = -DPTHREADS
 libtclParam_a_CFLAGS = 
 libtclParam_p_a_CFLAGS = -DPTHREADS
 
-pas_SOURCES = ca/server/arrayDest.cc ca/server/paramBlobRecord.cc ca/server/paramFilenameRecord.cc ca/server/paramIntRecord.cc ca/server/paramRecord.cc ca/server/paramRecordSet.cc ca/server/paramStringRecord.cc ca/server/record.cc ca/server/paramServer.cc
+pas_SOURCES = ca/server/arrayDest.cc ca/server/paramBlobRecord.cc ca/server/paramFilenameRecord.cc ca/server/paramIntRecord.cc ca/server/paramRecordSet.cc ca/server/paramStringRecord.cc ca/server/record.cc ca/server/paramServer.cc
 
 EXTRA_BUILT_SOURCES_MY = oraParam.c
 subdir = .
@@ -166,9 +166,8 @@ PROGRAMS = $(bin_PROGRAMS)
 
 am_pas_OBJECTS = arrayDest.$(OBJEXT) paramBlobRecord.$(OBJEXT) \
 	paramFilenameRecord.$(OBJEXT) paramIntRecord.$(OBJEXT) \
-	paramRecord.$(OBJEXT) paramRecordSet.$(OBJEXT) \
-	paramStringRecord.$(OBJEXT) record.$(OBJEXT) \
-	paramServer.$(OBJEXT)
+	paramRecordSet.$(OBJEXT) paramStringRecord.$(OBJEXT) \
+	record.$(OBJEXT) paramServer.$(OBJEXT)
 pas_OBJECTS = $(am_pas_OBJECTS)
 pas_LDADD = $(LDADD)
 pas_DEPENDENCIES =
@@ -193,7 +192,6 @@ am__depfiles_maybe = depfiles
 @AMDEP_TRUE@	./$(DEPDIR)/paramBlobRecord.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/paramFilenameRecord.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/paramIntRecord.Po \
-@AMDEP_TRUE@	./$(DEPDIR)/paramRecord.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/paramRecordSet.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/paramServer.Po \
 @AMDEP_TRUE@	./$(DEPDIR)/paramStringRecord.Po \
@@ -360,7 +358,6 @@ arrayDest.$(OBJEXT): ca/server/arrayDest.cc
 paramBlobRecord.$(OBJEXT): ca/server/paramBlobRecord.cc
 paramFilenameRecord.$(OBJEXT): ca/server/paramFilenameRecord.cc
 paramIntRecord.$(OBJEXT): ca/server/paramIntRecord.cc
-paramRecord.$(OBJEXT): ca/server/paramRecord.cc
 paramRecordSet.$(OBJEXT): ca/server/paramRecordSet.cc
 paramStringRecord.$(OBJEXT): ca/server/paramStringRecord.cc
 record.$(OBJEXT): ca/server/record.cc
@@ -387,7 +384,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramBlobRecord.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramFilenameRecord.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramIntRecord.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramRecord.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramRecordSet.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramServer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paramStringRecord.Po@am__quote@
@@ -565,18 +561,6 @@ paramIntRecord.obj: ca/server/paramIntRecord.cc
 @AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o paramIntRecord.obj `cygpath -w ca/server/paramIntRecord.cc`
 
-paramRecord.o: ca/server/paramRecord.cc
-@AMDEP_TRUE@	source='ca/server/paramRecord.cc' object='paramRecord.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@	depfile='$(DEPDIR)/paramRecord.Po' tmpdepfile='$(DEPDIR)/paramRecord.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o paramRecord.o `test -f 'ca/server/paramRecord.cc' || echo '$(srcdir)/'`ca/server/paramRecord.cc
-
-paramRecord.obj: ca/server/paramRecord.cc
-@AMDEP_TRUE@	source='ca/server/paramRecord.cc' object='paramRecord.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@	depfile='$(DEPDIR)/paramRecord.Po' tmpdepfile='$(DEPDIR)/paramRecord.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o paramRecord.obj `cygpath -w ca/server/paramRecord.cc`
-
 paramRecordSet.o: ca/server/paramRecordSet.cc
 @AMDEP_TRUE@	source='ca/server/paramRecordSet.cc' object='paramRecordSet.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@	depfile='$(DEPDIR)/paramRecordSet.Po' tmpdepfile='$(DEPDIR)/paramRecordSet.TPo' @AMDEPBACKSLASH@
diff --git a/allParam/ca/server/paramBlobRecord.cc b/allParam/ca/server/paramBlobRecord.cc
index 6b652fb..cbeafec 100644
--- a/allParam/ca/server/paramBlobRecord.cc
+++ b/allParam/ca/server/paramBlobRecord.cc
@@ -1,4 +1,4 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramBlobRecord.cc,v 1.13 2003-01-31 12:25:32 hadaq Exp $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramBlobRecord.cc,v 1.14 2003-05-19 11:01:55 sailer Exp $";
 #define _POSIX_C_SOURCE 199509L
 
 #if HAVE_CONFIG_H
@@ -17,7 +17,7 @@ extern "C" {
 #define EPICS_MAX_INDEX 4092
 
 ParamBlobRecord::ParamBlobRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
-  ParamRecord(cas, p, rn, u)
+  Record(cas, p, rn, u, aitEnumUint32)
 {
 	size_t size;
 	FILE *tmp;
@@ -39,15 +39,15 @@ ParamBlobRecord::ParamBlobRecord(caServer& cas, const Param *p, const char *rn,
 	funcTable.installReadFunc("severity", &Record::readSeverity);
 	funcTable.installReadFunc("seconds", &Record::readSeconds);
 
-	funcTable.installReadFunc("alarmLow", &ParamRecord::readAlarmLow);
-	funcTable.installReadFunc("alarmHigh", &ParamRecord::readAlarmHigh);
-	funcTable.installReadFunc("alarmLowWarning", &ParamRecord::readAlarmLowWarning);
-	funcTable.installReadFunc("alarmHighWarning", &ParamRecord::readAlarmHighWarning);
-	funcTable.installReadFunc("graphicLow", &ParamRecord::readGraphicLow);
-	funcTable.installReadFunc("graphicHigh", &ParamRecord::readGraphicHigh);
-	funcTable.installReadFunc("controlLow", &ParamRecord::readControlLow);
-	funcTable.installReadFunc("controlHigh", &ParamRecord::readControlHigh);
-	funcTable.installReadFunc("precision", &ParamRecord::readPrecision);
+	funcTable.installReadFunc("alarmLow", &Record::readAlarmLow);
+	funcTable.installReadFunc("alarmHigh", &Record::readAlarmHigh);
+	funcTable.installReadFunc("alarmLowWarning", &Record::readAlarmLowWarning);
+	funcTable.installReadFunc("alarmHighWarning", &Record::readAlarmHighWarning);
+	funcTable.installReadFunc("graphicLow", &Record::readGraphicLow);
+	funcTable.installReadFunc("graphicHigh", &Record::readGraphicHigh);
+	funcTable.installReadFunc("controlLow", &Record::readControlLow);
+	funcTable.installReadFunc("controlHigh", &Record::readControlHigh);
+	funcTable.installReadFunc("precision", &Record::readPrecision);
 
 	funcTable.installReadFunc("value", &ParamBlobRecord::readValue);
 }
@@ -126,7 +126,13 @@ caStatus ParamBlobRecord::scan()
 	val->setSevr(epicsSevNone);
 
 	if (this->interest == aitTrue && pCAS != NULL) {
-		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|pCAS->alarmEventMask);
+#if EPICS_RELEASE >= 314
+		casEventMask select(pCAS->valueEventMask()|pCAS->logEventMask()|
+							pCAS->alarmEventMask());
+#else
+		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|
+							pCAS->alarmEventMask);
+#endif
 		this->postEvent (select, *val);
 	}
 
@@ -138,7 +144,11 @@ caStatus ParamBlobRecord::read(const casCtx &ctx, gdd &prototype)
 	return ((scan() == S_cas_success) && funcTable.read(*this, prototype));
 }
 
+#if EPICS_RELEASE >= 314
+caStatus ParamBlobRecord::write(const casCtx &ctx, const gdd &value)
+#else
 caStatus ParamBlobRecord::write(const casCtx &ctx, gdd &value)
+#endif
 {
 	return S_cas_noWrite;
 }
diff --git a/allParam/ca/server/paramBlobRecord.h b/allParam/ca/server/paramBlobRecord.h
index 6693c8d..7a8c931 100644
--- a/allParam/ca/server/paramBlobRecord.h
+++ b/allParam/ca/server/paramBlobRecord.h
@@ -3,22 +3,27 @@
 
 #include "paramRecord.h"
 
-class ParamBlobRecord : public ParamRecord {
+class ParamBlobRecord : public Record {
   private:
 	aitIndex index;
 	gddAppFuncTable<ParamBlobRecord> funcTable;
 
   public:
-	ParamBlobRecord(caServer&, const Param *, const char *, const char *);
+	ParamBlobRecord(caServer&, const Param *p, const char *rn, const char *u);
 	~ParamBlobRecord();
 
 	epicsShareFunc aitEnum bestExternalType() const;
 	epicsShareFunc unsigned maxDimension() const;
 	epicsShareFunc aitIndex maxBound(unsigned int) const;
 	gddAppFuncTableStatus readValue(gdd &);
+
 	caStatus scan();
-	caStatus read(const casCtx &, gdd &);
-	caStatus write(const casCtx &, gdd &);
+	caStatus read(const casCtx &ctx, gdd &value);
+#if EPICS_RELEASE >= 314
+	caStatus write(const casCtx &ctx, const gdd &value);
+#else
+	caStatus write(const casCtx &ctx, gdd &value);
+#endif
 };
 
 #endif /* !PARAMBLOBRECORD_H */
diff --git a/allParam/ca/server/paramFilenameRecord.cc b/allParam/ca/server/paramFilenameRecord.cc
index a0fab92..eddc5b1 100644
--- a/allParam/ca/server/paramFilenameRecord.cc
+++ b/allParam/ca/server/paramFilenameRecord.cc
@@ -1,4 +1,4 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramFilenameRecord.cc,v 1.9 2003-01-31 12:25:32 hadaq Exp $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramFilenameRecord.cc,v 1.10 2003-05-19 11:01:55 sailer Exp $";
 #define _POSIX_C_SOURCE 199509L
 
 #if HAVE_CONFIG_H
@@ -14,7 +14,7 @@ extern "C" {
 #include "paramFilenameRecord.h"
 
 ParamFilenameRecord::ParamFilenameRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
-  ParamRecord(cas, p, rn, u)
+  Record(cas, p, rn, u, aitEnumString)
 {
 	int rows;
 	char *tmp[PARAM_MAX_ARRAY_LEN];
@@ -38,15 +38,15 @@ ParamFilenameRecord::ParamFilenameRecord(caServer& cas, const Param *p, const ch
 	funcTable.installReadFunc("severity", &Record::readSeverity);
 	funcTable.installReadFunc("seconds", &Record::readSeconds);
 
-	funcTable.installReadFunc("alarmLow", &ParamRecord::readAlarmLow);
-	funcTable.installReadFunc("alarmHigh", &ParamRecord::readAlarmHigh);
-	funcTable.installReadFunc("alarmLowWarning", &ParamRecord::readAlarmLowWarning);
-	funcTable.installReadFunc("alarmHighWarning", &ParamRecord::readAlarmHighWarning);
-	funcTable.installReadFunc("graphicLow", &ParamRecord::readGraphicLow);
-	funcTable.installReadFunc("graphicHigh", &ParamRecord::readGraphicHigh);
-	funcTable.installReadFunc("controlLow", &ParamRecord::readControlLow);
-	funcTable.installReadFunc("controlHigh", &ParamRecord::readControlHigh);
-	funcTable.installReadFunc("precision", &ParamRecord::readPrecision);
+	funcTable.installReadFunc("alarmLow", &Record::readAlarmLow);
+	funcTable.installReadFunc("alarmHigh", &Record::readAlarmHigh);
+	funcTable.installReadFunc("alarmLowWarning", &Record::readAlarmLowWarning);
+	funcTable.installReadFunc("alarmHighWarning", &Record::readAlarmHighWarning);
+	funcTable.installReadFunc("graphicLow", &Record::readGraphicLow);
+	funcTable.installReadFunc("graphicHigh", &Record::readGraphicHigh);
+	funcTable.installReadFunc("controlLow", &Record::readControlLow);
+	funcTable.installReadFunc("controlHigh", &Record::readControlHigh);
+	funcTable.installReadFunc("precision", &Record::readPrecision);
 
 	funcTable.installReadFunc("value", &ParamFilenameRecord::readValue);
 }
@@ -156,7 +156,13 @@ caStatus ParamFilenameRecord::scan()
 	val->setSevr(epicsSevNone);
 
 	if (this->interest == aitTrue && pCAS != NULL) {
-		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|pCAS->alarmEventMask);
+#if EPICS_RELEASE >= 314
+		casEventMask select(pCAS->valueEventMask()|pCAS->logEventMask()|
+							pCAS->alarmEventMask());
+#else
+		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|
+							pCAS->alarmEventMask);
+#endif
 		this->postEvent (select, *val);
 	}
 
@@ -168,7 +174,11 @@ caStatus ParamFilenameRecord::read(const casCtx &ctx, gdd &prototype)
 	return ((scan() == S_cas_success) && funcTable.read(*this, prototype));
 }
 
+#if EPICS_RELEASE >= 314
+caStatus ParamFilenameRecord::write(const casCtx &ctx, const gdd &value)
+#else
 caStatus ParamFilenameRecord::write(const casCtx &ctx, gdd &value)
+#endif
 {
 	return S_cas_noWrite;
 }
diff --git a/allParam/ca/server/paramFilenameRecord.h b/allParam/ca/server/paramFilenameRecord.h
index 62b3645..ce75662 100644
--- a/allParam/ca/server/paramFilenameRecord.h
+++ b/allParam/ca/server/paramFilenameRecord.h
@@ -3,23 +3,28 @@
 
 #include "paramRecord.h"
 
-class ParamFilenameRecord : public ParamRecord {
+class ParamFilenameRecord : public Record {
   private:
 	aitIndex index;
 	char *ourValue[PARAM_MAX_ARRAY_LEN];
 	gddAppFuncTable<ParamFilenameRecord> funcTable;
 
   public:
-	ParamFilenameRecord(caServer&, const Param *, const char *, const char *);
+	ParamFilenameRecord(caServer&, const Param *p, const char *rn, const char *u);
 	~ParamFilenameRecord();
 
 	epicsShareFunc aitEnum bestExternalType() const;
 	epicsShareFunc unsigned maxDimension() const;
 	epicsShareFunc aitIndex maxBound(unsigned int) const;
 	gddAppFuncTableStatus readValue(gdd &);
+
 	caStatus scan();
-	caStatus read(const casCtx &, gdd &);
-	caStatus write(const casCtx &, gdd &);
+	caStatus read(const casCtx &ctx, gdd &value);
+#if EPICS_RELEASE >= 314
+	caStatus write(const casCtx &ctx, const gdd &value);
+#else
+	caStatus write(const casCtx &ctx, gdd &value);
+#endif
 };
 
 #endif /* !PARAMFILENAMERECORD_H */
diff --git a/allParam/ca/server/paramIntRecord.cc b/allParam/ca/server/paramIntRecord.cc
index ab74162..0138b05 100644
--- a/allParam/ca/server/paramIntRecord.cc
+++ b/allParam/ca/server/paramIntRecord.cc
@@ -1,4 +1,4 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramIntRecord.cc,v 1.12 2003-01-31 12:25:32 hadaq Exp $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramIntRecord.cc,v 1.13 2003-05-19 11:01:55 sailer Exp $";
 #define _POSIX_C_SOURCE 199509L
 
 #if HAVE_CONFIG_H
@@ -14,7 +14,7 @@ extern "C" {
 #include "paramIntRecord.h"
 
 ParamIntRecord::ParamIntRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
-  ParamRecord(cas, p, rn, u)
+  Record(cas, p, rn, u, aitEnumUint32)
 {
 	int rows;
 	unsigned long int tmp[PARAM_MAX_ARRAY_LEN];
@@ -35,15 +35,15 @@ ParamIntRecord::ParamIntRecord(caServer& cas, const Param *p, const char *rn, co
 	funcTable.installReadFunc("severity", &Record::readSeverity);
 	funcTable.installReadFunc("seconds", &Record::readSeconds);
 
-	funcTable.installReadFunc("alarmLow", &ParamRecord::readAlarmLow);
-	funcTable.installReadFunc("alarmHigh", &ParamRecord::readAlarmHigh);
-	funcTable.installReadFunc("alarmLowWarning", &ParamRecord::readAlarmLowWarning);
-	funcTable.installReadFunc("alarmHighWarning", &ParamRecord::readAlarmHighWarning);
-	funcTable.installReadFunc("graphicLow", &ParamRecord::readGraphicLow);
-	funcTable.installReadFunc("graphicHigh", &ParamRecord::readGraphicHigh);
-	funcTable.installReadFunc("controlLow", &ParamRecord::readControlLow);
-	funcTable.installReadFunc("controlHigh", &ParamRecord::readControlHigh);
-	funcTable.installReadFunc("precision", &ParamRecord::readPrecision);
+	funcTable.installReadFunc("alarmLow", &Record::readAlarmLow);
+	funcTable.installReadFunc("alarmHigh", &Record::readAlarmHigh);
+	funcTable.installReadFunc("alarmLowWarning", &Record::readAlarmLowWarning);
+	funcTable.installReadFunc("alarmHighWarning", &Record::readAlarmHighWarning);
+	funcTable.installReadFunc("graphicLow", &Record::readGraphicLow);
+	funcTable.installReadFunc("graphicHigh", &Record::readGraphicHigh);
+	funcTable.installReadFunc("controlLow", &Record::readControlLow);
+	funcTable.installReadFunc("controlHigh", &Record::readControlHigh);
+	funcTable.installReadFunc("precision", &Record::readPrecision);
 
 	funcTable.installReadFunc("value", &ParamIntRecord::readValue);
 }
@@ -135,7 +135,13 @@ caStatus ParamIntRecord::scan()
 	val->setSevr(epicsSevNone);
 
 	if (this->interest == aitTrue && pCAS != NULL) {
-		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|pCAS->alarmEventMask);
+#if EPICS_RELEASE >= 314
+		casEventMask select(pCAS->valueEventMask()|pCAS->logEventMask()|
+							pCAS->alarmEventMask());
+#else
+		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|
+							pCAS->alarmEventMask);
+#endif
 		this->postEvent (select, *val);
 	}
 
@@ -147,7 +153,11 @@ caStatus ParamIntRecord::read(const casCtx &ctx, gdd &prototype)
 	return ((scan() == S_cas_success) && funcTable.read(*this, prototype));
 }
 
+#if EPICS_RELEASE >= 314
+caStatus ParamIntRecord::write(const casCtx &ctx, const gdd &value)
+#else
 caStatus ParamIntRecord::write(const casCtx &ctx, gdd &value)
+#endif
 {
 	aitUint32 intValue;
 
diff --git a/allParam/ca/server/paramIntRecord.h b/allParam/ca/server/paramIntRecord.h
index 2049317..40ca087 100644
--- a/allParam/ca/server/paramIntRecord.h
+++ b/allParam/ca/server/paramIntRecord.h
@@ -4,23 +4,28 @@
 #include "paramRecord.h"
 #include "arrayDest.h"
 
-class ParamIntRecord : public ParamRecord {
+class ParamIntRecord : public Record {
   private:
 	aitIndex index;
 	unsigned long int ourValue[PARAM_MAX_ARRAY_LEN];
 	gddAppFuncTable<ParamIntRecord> funcTable;
 
   public:
-	ParamIntRecord(caServer&, const Param *, const char *, const char *);
+	ParamIntRecord(caServer&, const Param *p, const char *rn, const char *u);
 	~ParamIntRecord();
 
 	epicsShareFunc aitEnum bestExternalType() const;
 	epicsShareFunc unsigned maxDimension() const;
 	epicsShareFunc aitIndex maxBound(unsigned int) const;
 	gddAppFuncTableStatus readValue(gdd &);
+
 	caStatus scan();
-	caStatus read(const casCtx &, gdd &);
-	caStatus write(const casCtx &, gdd &);
+	caStatus read(const casCtx &ctx, gdd &value);
+#if EPICS_RELEASE >= 314
+	caStatus write(const casCtx &ctx, const gdd &value);
+#else
+	caStatus write(const casCtx &ctx, gdd &value);
+#endif
 };
 
 #endif /* !PARAMINTRECORD_H */
diff --git a/allParam/ca/server/paramRecord.cc b/allParam/ca/server/paramRecord.cc
deleted file mode 100644
index ce9cf6e..0000000
--- a/allParam/ca/server/paramRecord.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/Attic/paramRecord.cc,v 1.9 2003-01-31 12:25:32 hadaq Exp $";
-#define _POSIX_C_SOURCE 199509L
-
-#if HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-extern "C" {
-  #include <unistd.h>
-
-  #include <ctype.h>
-  #include <stdio.h>
-  #include <string.h>
-}
-
-#include "paramRecord.h"
-
-ParamRecord::ParamRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
-  Record(cas, rn, u, aitEnumString), param(p)
-{
-	char tmp;
-	char buf1[PARAM_MAX_NAME_LEN];
-	char buf2[PARAM_MAX_NAME_LEN];
-	char buf3[PARAM_MAX_NAME_LEN];
-
-	strcpy(pPVName, rn);
-	strcpy(buf1, "");
-	strcpy(buf2, "");
-	strcpy(buf3, "");
-	if(sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &tmp, buf1, buf2, buf3) != 4) {
-		strcpy(name, buf1);
-		strcpy(idx, buf2);
-	} else {
-		strcpy(name, buf2);
-		strcpy(idx, buf3);
-	}
-
-	for (unsigned int i = 0 ; i < strlen(name) ; i++) {
-		name[i] = tolower(name[i]);
-	}
-	for (unsigned int i = 0 ; i < strlen(idx) ; i++) {
-		idx[i] = tolower(idx[i]);
-	}
-	interest = aitFalse;
-}
-
-ParamRecord::~ParamRecord()
-{
-	delete pDest;
-}
-
-const char *ParamRecord::getPVName()
-{
-	return pPVName;
-}
-
-gddAppFuncTableStatus ParamRecord::readAlarmLow(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readAlarmHigh(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readAlarmLowWarning(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readAlarmHighWarning(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readGraphicLow(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readGraphicHigh(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readControlLow(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readControlHigh(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
-gddAppFuncTableStatus ParamRecord::readPrecision(gdd &value)
-{
-	value.putConvert(0);
-	return S_casApp_success;
-}
-
diff --git a/allParam/ca/server/paramRecord.h b/allParam/ca/server/paramRecord.h
deleted file mode 100644
index 9271384..0000000
--- a/allParam/ca/server/paramRecord.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef PARAMRECORD_H
-#define PARAMRECORD_H
-
-#include <gdd.h>
-
-extern "C" {
-  #include <allParam.h>
-}
-
-#include "record.h"
-#include "arrayDest.h"
-
-class ParamRecord : public Record {
-  protected:
-	ArrayDestructor *pDest;
-	const Param *param;
-	char pPVName[PARAM_MAX_VALUE_LEN];
-	char name[PARAM_MAX_VALUE_LEN];
-	char idx[PARAM_MAX_VALUE_LEN];
-
-  public:
-	ParamRecord(caServer&, const Param *, const char *, const char *);
-	~ParamRecord();
-
-	const char *getPVName();
-
-	virtual gddAppFuncTableStatus readAlarmLow(gdd &);
-	virtual gddAppFuncTableStatus readAlarmHigh(gdd &);
-	virtual gddAppFuncTableStatus readAlarmLowWarning(gdd &);
-	virtual gddAppFuncTableStatus readAlarmHighWarning(gdd &);
-	virtual gddAppFuncTableStatus readGraphicLow(gdd &);
-	virtual gddAppFuncTableStatus readGraphicHigh(gdd &);
-	virtual gddAppFuncTableStatus readControlLow(gdd &);
-	virtual gddAppFuncTableStatus readControlHigh(gdd &);
-	virtual gddAppFuncTableStatus readPrecision(gdd &);
-
-	virtual gddAppFuncTableStatus readValue(gdd &) = 0;
-
-	virtual caStatus scan() = 0;
-	virtual caStatus read(const casCtx &, gdd &) = 0;
-	virtual caStatus write(const casCtx &, gdd &) = 0;
-};
-
-#endif /* !PARAMRECORD_H */
-
diff --git a/allParam/ca/server/paramRecordSet.h b/allParam/ca/server/paramRecordSet.h
index bb3f570..400c062 100644
--- a/allParam/ca/server/paramRecordSet.h
+++ b/allParam/ca/server/paramRecordSet.h
@@ -15,7 +15,7 @@ extern "C" {
 class ParamRecordSet : public caServer {
   private:
     int numPv;
-    ParamRecord *pvs[MAX_NUM_PV];
+    Record *pvs[MAX_NUM_PV];
 
     int numParamSrc;
     Param *param[MAX_PARAM_SRC];
diff --git a/allParam/ca/server/paramServer.cc b/allParam/ca/server/paramServer.cc
index 0ecd84a..bb707ec 100644
--- a/allParam/ca/server/paramServer.cc
+++ b/allParam/ca/server/paramServer.cc
@@ -1,30 +1,126 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramServer.cc,v 1.5 2003-01-31 12:25:32 hadaq Exp $";
-#define _POSIX_C_SOURCE 199509L
+static const char rcsId[] =
+	"$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramServer.cc,v 1.6 2003-05-19 11:01:55 sailer Exp $";
+#define _POSIX_C_SOURCE 199506L
+#define SYSLOG_NAMES
 
 #if HAVE_CONFIG_H
 #include <config.h>
 #endif /* HAVE_CONFIG_H */
 
 extern "C" {
-  #include <unistd.h>
+extern char *optarg;
+extern int optind, opterr, optopt;
 
-  #include <ctype.h>
-  #include <string.h>
-  #include <syslog.h>
+#include <unistd.h>
+
+#include <ctype.h>
+#include <string.h>
+#include <syslog.h>
 }
 
 #include <fdManager.h>
 
 #include "paramRecordSet.h"
 
-int main(int argc, char *argv[]) {
-	openlog(argv[0], LOG_PERROR | LOG_PID, LOG_LOCAL0);
+static const char *ourBasename(const char *s)
+{
+	const char *p;
+
+	p = strrchr(s, '/');
+	return p != NULL ? p + 1 : s;
+}
+
+static void help(const char *name)
+{
+	fprintf(stdout, "%s: Usage(1): %s [ -d ] [ -v verbosity ] [ -w workdir ]\n", name, name);
+	fprintf(stdout, "%s:           Option -d (optional): start as daemon\n",
+			name);
+	fprintf(stdout, "%s:           Option -v (optional): verbosity,  defaults to info\n", name);
+	fprintf(stdout, "%s:           Option -w (optional): workdir for temporary files (needs to be unique)\n", name);
+	fprintf(stdout, "%s: Usage(2): %s -h\n", name, name);
+	fprintf(stdout, "%s:           Option -h (required): help\n", name);
+}
+
+static void usage(const char *name)
+{
+	fprintf(stderr, "%s: Usage(1): %s [ -d ] [ -v verbosity ] [ -w workdir ]\n", name, name);
+	fprintf(stderr, "%s: Usage(2): %s -h\n", name, name);
+}
+
+int main(int argc, char *argv[])
+{
+	int logoption = LOG_PID;
+	pid_t myPid = 0;
+	int daemon = 0;
+	int i;
+	char *cwd = NULL;
+	int val;
+	char *verbosity = NULL;
+
+	while((val = getopt(argc, argv, "dhv:w:")) != -1) {
+		switch(val) {
+			case('d'):
+				daemon = 1;
+				break;
+			case('h'):
+				help(ourBasename(argv[0]));
+				exit(EXIT_SUCCESS);
+				break;
+			case('v'):
+				verbosity = optarg;
+				break;
+			case('w'):
+				cwd = optarg;
+				break;
+			default:
+				usage(ourBasename(argv[0]));
+				exit(EXIT_FAILURE);
+		}
+	}
+
+	if (daemon) {
+		if (0 < (myPid = fork())) {
+			exit(EXIT_SUCCESS);
+		} else {
+			setsid();
+			if (0 < (myPid = fork())) {
+				exit(EXIT_SUCCESS);
+			} else {
+				if (!cwd) {
+					cwd = "/";
+				}
+				chdir(cwd);
+				freopen("/dev/null", "r", stdin);
+				freopen("/dev/null", "a", stdout);
+				freopen("/dev/console", "a", stderr);
+				myPid = getpid();
+			}
+		}
+	} else {
+		logoption |= LOG_PERROR;
+	}
+
+	openlog(ourBasename(argv[0]), logoption, LOG_LOCAL0);
+
+	if (verbosity == NULL) {
+		verbosity = "info";
+	}
+	for (i = 0; prioritynames[i].c_name != NULL
+		&& 0 != strcmp(prioritynames[i].c_name, verbosity); i++) {
+	}
+	if (prioritynames[i].c_name == NULL) {
+		syslog(LOG_ERR, "%s, %d: Unknown verbosity %s. Exiting.",
+			   __FILE__, __LINE__, verbosity);
+		exit(EXIT_FAILURE);
+	} else {
+		setlogmask(LOG_UPTO(prioritynames[i].c_val));
+	}
 
 	ParamRecordSet *cas;
 
 	if (NULL == (cas = new ParamRecordSet(MAX_NUM_PV))) {
-		syslog(LOG_ERR, "Cannot allocate memory for the RecordSet. Exiting.\n");
-		exit(-1);
+		syslog(LOG_ERR, "Cannot allocate memory for the RecordSet. Exiting.");
+		exit(EXIT_FAILURE);
 	}                                                                       
 
 	cas->setDebugLevel(0u);
diff --git a/allParam/ca/server/paramStringRecord.cc b/allParam/ca/server/paramStringRecord.cc
index 8cbe49f..65c2024 100644
--- a/allParam/ca/server/paramStringRecord.cc
+++ b/allParam/ca/server/paramStringRecord.cc
@@ -1,4 +1,4 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramStringRecord.cc,v 1.11 2003-01-31 12:25:32 hadaq Exp $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramStringRecord.cc,v 1.12 2003-05-19 11:01:55 sailer Exp $";
 #define _POSIX_C_SOURCE 199509L
 
 #if HAVE_CONFIG_H
@@ -14,7 +14,7 @@ extern "C" {
 #include "paramStringRecord.h"
 
 ParamStringRecord::ParamStringRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
-  ParamRecord(cas, p, rn, u)
+  Record(cas, p, rn, u, aitEnumString)
 {
 	int rows;
 	char *tmp[PARAM_MAX_ARRAY_LEN];
@@ -38,15 +38,15 @@ ParamStringRecord::ParamStringRecord(caServer& cas, const Param *p, const char *
 	funcTable.installReadFunc("severity", &Record::readSeverity);
 	funcTable.installReadFunc("seconds", &Record::readSeconds);
 
-	funcTable.installReadFunc("alarmLow", &ParamRecord::readAlarmLow);
-	funcTable.installReadFunc("alarmHigh", &ParamRecord::readAlarmHigh);
-	funcTable.installReadFunc("alarmLowWarning", &ParamRecord::readAlarmLowWarning);
-	funcTable.installReadFunc("alarmHighWarning", &ParamRecord::readAlarmHighWarning);
-	funcTable.installReadFunc("graphicLow", &ParamRecord::readGraphicLow);
-	funcTable.installReadFunc("graphicHigh", &ParamRecord::readGraphicHigh);
-	funcTable.installReadFunc("controlLow", &ParamRecord::readControlLow);
-	funcTable.installReadFunc("controlHigh", &ParamRecord::readControlHigh);
-	funcTable.installReadFunc("precision", &ParamRecord::readPrecision);
+	funcTable.installReadFunc("alarmLow", &Record::readAlarmLow);
+	funcTable.installReadFunc("alarmHigh", &Record::readAlarmHigh);
+	funcTable.installReadFunc("alarmLowWarning", &Record::readAlarmLowWarning);
+	funcTable.installReadFunc("alarmHighWarning", &Record::readAlarmHighWarning);
+	funcTable.installReadFunc("graphicLow", &Record::readGraphicLow);
+	funcTable.installReadFunc("graphicHigh", &Record::readGraphicHigh);
+	funcTable.installReadFunc("controlLow", &Record::readControlLow);
+	funcTable.installReadFunc("controlHigh", &Record::readControlHigh);
+	funcTable.installReadFunc("precision", &Record::readPrecision);
 
 	funcTable.installReadFunc("value", &ParamStringRecord::readValue);
 }
@@ -156,7 +156,13 @@ caStatus ParamStringRecord::scan()
 	}
 
 	if (this->interest == aitTrue && pCAS != NULL) {
-		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|pCAS->alarmEventMask);
+#if EPICS_RELEASE >= 314
+		casEventMask select(pCAS->valueEventMask()|pCAS->logEventMask()|
+							pCAS->alarmEventMask());
+#else
+		casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|
+							pCAS->alarmEventMask);
+#endif
 		this->postEvent (select, *val);
 	}
 
@@ -168,7 +174,11 @@ caStatus ParamStringRecord::read(const casCtx &ctx, gdd &prototype)
 	return ((scan() == S_cas_success) && funcTable.read(*this, prototype));
 }
 
+#if EPICS_RELEASE >= 314
+caStatus ParamStringRecord::write(const casCtx &ctx, const gdd &value)
+#else
 caStatus ParamStringRecord::write(const casCtx &ctx, gdd &value)
+#endif
 {
 	aitString stringValue;
 
diff --git a/allParam/ca/server/paramStringRecord.h b/allParam/ca/server/paramStringRecord.h
index 75a7d30..680acdb 100644
--- a/allParam/ca/server/paramStringRecord.h
+++ b/allParam/ca/server/paramStringRecord.h
@@ -3,23 +3,28 @@
 
 #include "paramRecord.h"
 
-class ParamStringRecord : public ParamRecord {
+class ParamStringRecord : public Record {
   private:
 	aitIndex index;
 	char *ourValue[PARAM_MAX_ARRAY_LEN];
 	gddAppFuncTable<ParamStringRecord> funcTable;
 
   public:
-	ParamStringRecord(caServer&, const Param *, const char *, const char *);
+	ParamStringRecord(caServer&, const Param *p, const char *rn, const char *u);
 	~ParamStringRecord();
 
 	epicsShareFunc aitEnum bestExternalType() const;
 	epicsShareFunc unsigned maxDimension() const;
 	epicsShareFunc aitIndex maxBound(unsigned int) const;
 	gddAppFuncTableStatus readValue(gdd &);
+
 	caStatus scan();
-	caStatus read(const casCtx &, gdd &);
-	caStatus write(const casCtx &, gdd &);
+	caStatus read(const casCtx &ctx, gdd &value);
+#if EPICS_RELEASE >= 314
+	caStatus write(const casCtx &ctx, const gdd &value);
+#else
+	caStatus write(const casCtx &ctx, gdd &value);
+#endif
 };
 
 #endif /* !PARAMSTRINGRECORD_H */
diff --git a/allParam/ca/server/record.cc b/allParam/ca/server/record.cc
index e63ddf0..366a89c 100644
--- a/allParam/ca/server/record.cc
+++ b/allParam/ca/server/record.cc
@@ -1,94 +1,202 @@
-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/record.cc,v 1.4 2003-01-31 12:25:32 hadaq Exp $";
-#define _POSIX_C_SOURCE 199509L
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/record.cc,v 1.5 2003-05-19 11:01:56 sailer Exp $";
+#define _POSIX_C_SOURCE 199506L
 
 #if HAVE_CONFIG_H
 #include <config.h>
 #endif /* HAVE_CONFIG_H */
 
 extern "C" {
-  #include <unistd.h>
+#include <unistd.h>
 
-  #include <string.h>
-  #include <time.h>
+#include <ctype.h>
+#include <string.h>
+#include <time.h>
 }
 
 #include "record.h"
 
-/******************** 
- * record Functions *
- ********************/
-
-Record::Record(caServer &cas, const char *n, const char *u, aitEnum t) : casPV(cas), units(u), type(t) {
-	strcpy (name, n);
+#if EPICS_RELEASE >= 314
+Record::Record(caServer &cas, const Param *p, const char *n, const char *u, aitEnum t) : casPV(cas), param(p), units(u), type(t), timer(getCAS()->createTimer())
+#else
+Record::Record(caServer &cas, const Param *p, const char *n, const char *u, aitEnum t) : casPV(cas), param(p), units(u), type(t)
+#endif
+{
+	char buf1[PARAM_MAX_NAME_LEN];
+	char buf2[PARAM_MAX_NAME_LEN];
+	char buf3[PARAM_MAX_NAME_LEN];
+
+	strcpy (pPVName, n);
 	interest = aitFalse;
 
 	alarmStatus = epicsAlarmNone;
 	alarmSeverity = epicsSevNone;
 
+	if(sscanf(pPVName, "HAD:P%*c:%[^:]:%[^:]:%[^:]", buf1, buf2, buf3) != 4) {
+		strcpy(name, buf1);
+		strcpy(idx, buf2);
+	} else {
+		strcpy(name, buf2);
+		strcpy(idx, buf3);
+	}
+	for (unsigned int i = 0 ; i < strlen(name) ; i++) {
+		name[i] = tolower(name[i]);
+	}
+	for (unsigned int i = 0 ; i < strlen(idx) ; i++) {
+		idx[i] = tolower(idx[i]);
+	}
+
+	interest = aitFalse;
+
 	recordScanTimer = new scanTimer(*this);
+#if EPICS_RELEASE >= 314
+	timer.start(*recordScanTimer, 1.0);
+#endif
 }
 
-Record::~Record() {
+Record::~Record()
+{
+	delete pDest;
 }
 
-/* Misc Functions which are the same in all records */
-
-void Record::destroy() {
+void Record::destroy()
+{
 }
 
-caStatus Record::interestRegister() {
+caStatus Record::interestRegister()
+{
 	interest = aitTrue;
 	return S_casApp_success;
 }
 
-void Record::interestDelete() {
+void Record::interestDelete()
+{
 	interest = aitFalse;
 }
 
-const char *Record::getName() const {
-	return name;
+const char *Record::getName() const
+{
+	return pPVName;
 }
 
-aitEnum Record::bestExternalType() const {
+aitEnum Record::bestExternalType() const
+{
 	return type;
 }
 
-/* Read Functions which are the same for all records */
-
-gddAppFuncTableStatus Record::readUnits(gdd &value) {
+gddAppFuncTableStatus Record::readUnits(gdd &value)
+{
 	value.putConvert(*units);
 	return S_casApp_success;
 }
 
-gddAppFuncTableStatus Record::readStatus(gdd &value) {
-	value.putConvert((unsigned int) alarmStatus);
+gddAppFuncTableStatus Record::readStatus(gdd &value)
+{
+	value.putConvert((aitInt32) alarmStatus);
 	return S_casApp_success;
 }
 
-gddAppFuncTableStatus Record::readSeverity(gdd &value) {
-	value.putConvert((unsigned int) alarmSeverity);
+gddAppFuncTableStatus Record::readSeverity(gdd &value)
+{
+	value.putConvert((aitInt32) alarmSeverity);
 	return S_casApp_success;
 }
 
-gddAppFuncTableStatus Record::readSeconds(gdd &value) {
+gddAppFuncTableStatus Record::readSeconds(gdd &value)
+{
 	time_t now;
 	now = time(NULL);
 	value.putConvert((aitUint32) now);
 	return S_casApp_success;
 }
 
-/***********************
- * scanTimer Functions *
- ***********************/
+gddAppFuncTableStatus Record::readName(gdd &value)
+{
+	value.putConvert(pPVName);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readAlarmLow(gdd &value)
+{
+	value.putConvert(0);
+	return S_casApp_success;
+}
 
-scanTimer::scanTimer (Record &pv) : osiTimer(1.0), procVar(pv) {
+gddAppFuncTableStatus Record::readAlarmHigh(gdd &value)
+{
+	value.putConvert(2147483647);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readAlarmLowWarning(gdd &value)
+{
+	value.putConvert(0);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readAlarmHighWarning(gdd &value)
+{
+	value.putConvert(2147483647);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readGraphicLow(gdd &value)
+{
+	value.putConvert(0);
+	return S_casApp_success;
 }
 
-void scanTimer::expire() {
+gddAppFuncTableStatus Record::readGraphicHigh(gdd &value)
+{
+	value.putConvert(2147483647);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readControlLow(gdd &value)
+{
+	value.putConvert(0);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readControlHigh(gdd &value)
+{
+	value.putConvert(2147483647);
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readEnums(gdd &value)
+{
+	value.putConvert((aitString) "not implemented");
+	return S_casApp_success;
+}
+
+gddAppFuncTableStatus Record::readPrecision(gdd &value)
+{
+	value.putConvert(0);
+	return S_casApp_success;
+}
+
+#if EPICS_RELEASE >= 314
+scanTimer::scanTimer (Record &pv) : procVar(pv)
+#else
+scanTimer::scanTimer (Record &pv) : osiTimer(1.0), procVar(pv)
+#endif
+{
+}
+
+#if EPICS_RELEASE >= 314
+epicsTimerNotify::expireStatus scanTimer::expire(const epicsTime &t)
+{
+	procVar.scan();
+	return expireStatus(restart, 1.0);
+}
+#else
+void scanTimer::expire()
+{
 	procVar.scan();
 }
 
-osiBool scanTimer::again() const {
+osiBool scanTimer::again() const
+{
 	return osiTrue;
 }
-
+#endif
diff --git a/allParam/ca/server/record.h b/allParam/ca/server/record.h
index f0a51b9..555654a 100644
--- a/allParam/ca/server/record.h
+++ b/allParam/ca/server/record.h
@@ -1,31 +1,50 @@
 #ifndef RECORD_H
 #define RECORD_H
 
-#include <casdef.h>
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif /* HAVE_CONFIG_H */
 
+#include <casdef.h>
+#if EPICS_RELEASE >= 314
+#include <epicsTimer.h>
+#else
 #include <osiTimer.h>
+#endif
 #include <aitTypes.h>
 #include <aitHelpers.h>
-
 #include <gddApps.h>
 #include <gddAppFuncTable.h>
 
-#define NAMELENGTH 28
+extern "C" {
+  #include <allParam.h>
+}
+
+#include "arrayDest.h"
 
 class scanTimer;
 
 class Record : public casPV {
   protected:
-	char name[NAMELENGTH + 1];
+	const Param *param;
 	const char *units;
 	aitEnum type;
 	gdd *val;
+#if EPICS_RELEASE >= 314
+	epicsTimer &timer;
+#endif
 	scanTimer *recordScanTimer;
 	aitBool interest;
 	epicsAlarmCondition alarmStatus;
 	epicsAlarmSeverity alarmSeverity;
+
+	ArrayDestructor *pDest;
+	char pPVName[PARAM_MAX_VALUE_LEN];
+	char name[PARAM_MAX_VALUE_LEN];
+	char idx[PARAM_MAX_VALUE_LEN];
+
   public:
-	Record(caServer&, const char*, const char*, aitEnum);
+	Record(caServer &cas, const Param *p, const char *n, const char *u, aitEnum t);
 	~Record();
 
 	void destroy();
@@ -34,17 +53,44 @@ class Record : public casPV {
 	const char *getName() const;
 	aitEnum bestExternalType() const;
 
+	inline const char *getPVName() { return pPVName; }
+
 	gddAppFuncTableStatus readUnits(gdd &);
 	gddAppFuncTableStatus readStatus(gdd &);
 	gddAppFuncTableStatus readSeverity(gdd &);
 	gddAppFuncTableStatus readSeconds(gdd &);
+	gddAppFuncTableStatus readName(gdd &);
+	gddAppFuncTableStatus readAlarmLow(gdd &);
+	gddAppFuncTableStatus readAlarmHigh(gdd &);
+	gddAppFuncTableStatus readAlarmLowWarning(gdd &);
+	gddAppFuncTableStatus readAlarmHighWarning(gdd &);
+	gddAppFuncTableStatus readGraphicLow(gdd &);
+	gddAppFuncTableStatus readGraphicHigh(gdd &);
+	gddAppFuncTableStatus readControlLow(gdd &);
+	gddAppFuncTableStatus readControlHigh(gdd &);
+	gddAppFuncTableStatus readEnums(gdd &);
+	gddAppFuncTableStatus readPrecision(gdd &);
 
 	virtual gddAppFuncTableStatus readValue(gdd &) = 0;
+
 	virtual caStatus scan() = 0;
 	virtual caStatus read(const casCtx &, gdd &) = 0;
+#if EPICS_RELEASE >= 314
+	virtual caStatus write(const casCtx &, const gdd &) = 0;
+#else
 	virtual caStatus write(const casCtx &, gdd &) = 0;
+#endif
 };
 
+#if EPICS_RELEASE >= 314
+class scanTimer : public epicsTimerNotify {
+  private:
+	Record &procVar;
+  public:
+	scanTimer(Record &);
+	expireStatus expire(const epicsTime &t);
+};
+#else
 class scanTimer : public osiTimer {
   private:
 	Record &procVar;
@@ -53,6 +99,7 @@ class scanTimer : public osiTimer {
 	void expire();
 	osiBool again() const;
 };
+#endif
 
 #endif /* !RECORD_H */
 
-- 
2.43.0