From 4735456f413fb5215aa3d9fd29e44c481c99912c Mon Sep 17 00:00:00 2001
From: Jonathan Hanks <jonathan.hanks@ligo.org>
Date: Wed, 8 Sep 2021 18:38:13 -0700
Subject: [PATCH] WIP on minor cleanups in main.cc of the sequencer.

* Added test builds of the sequencer to the cmake to facilitate building and debugging (non-functional as it does not build the dbd file, cmd file, ...
* Wrap the local EPICS variables in a new type to promote type safe read/write of data, plus give us a point to allow mocking the interface out.
* the casdf sequencer does not build right now.
---
 src/epics/seq/CMakeLists.txt       |  10 +
 src/epics/seq/epics_channel.hh     | 134 ++++++
 src/epics/seq/fixed_size_string.hh |   5 +
 src/epics/seq/main.cc              | 685 +++++++++++++----------------
 4 files changed, 445 insertions(+), 389 deletions(-)
 create mode 100644 src/epics/seq/epics_channel.hh

diff --git a/src/epics/seq/CMakeLists.txt b/src/epics/seq/CMakeLists.txt
index b737c73d6..dcd255b8c 100644
--- a/src/epics/seq/CMakeLists.txt
+++ b/src/epics/seq/CMakeLists.txt
@@ -9,6 +9,16 @@ target_include_directories(test_sequencer_unit_tests PUBLIC
 target_link_libraries(test_sequencer_unit_tests PUBLIC
     catch2)
 
+add_executable(test_casdf_seq
+        main.cc)
+target_link_libraries(test_casdf_seq PUBLIC ini_parsing shmem epics::seq epics::ca)
+target_compile_definitions(test_casdf_seq PUBLIC "-DCA_SDF=1")
+
+add_executable(test_seq
+        main.cc)
+target_link_libraries(test_seq PUBLIC ini_parsing shmem epics::seq epics::ca)
+
+
 if (Boost_FOUND)
 
 add_executable(standalone_edc
diff --git a/src/epics/seq/epics_channel.hh b/src/epics/seq/epics_channel.hh
new file mode 100644
index 000000000..1e35999f1
--- /dev/null
+++ b/src/epics/seq/epics_channel.hh
@@ -0,0 +1,134 @@
+//
+// Created by jonathan.hanks on 9/7/21.
+//
+
+#ifndef DAQD_TRUNK_EPICS_CHANNEL_HH
+#define DAQD_TRUNK_EPICS_CHANNEL_HH
+
+#include <cstdint>
+#include <type_traits>
+#include <stdexcept>
+
+#include "dbAccess.h"
+
+#include "fixed_size_string.hh"
+
+namespace epics
+{
+
+    using channel_name = embedded::fixed_string<256>;
+
+    inline channel_name
+    make_name(const char* prefix, const char* name)
+    {
+        channel_name output{};
+        output.printf("%s_%s", prefix, name);
+        return output;
+    }
+
+    template < dbfType T >
+    struct type_lookup
+    {
+    };
+
+    template <>
+    struct type_lookup<DBF_USHORT>
+    {
+        using type=std::uint16_t;
+    };
+
+    template <>
+    struct type_lookup<DBF_LONG>
+    {
+        using type=std::int32_t;
+    };
+
+    template <>
+    struct type_lookup<DBF_ULONG>
+    {
+        using type=std::uint32_t;
+    };
+
+
+    template <>
+    struct type_lookup<DBF_DOUBLE>
+    {
+        using type=double;
+    };
+
+    template <>
+    struct type_lookup<DBF_STRING>
+    {
+        using type=embedded::fixed_string<256>;
+    };
+
+
+    template<dbfType DataType>
+    class DBEntry {
+    public:
+        struct ValidateAddress {};
+
+        using value_type = typename type_lookup<DataType>::type;
+
+        explicit DBEntry(channel_name name)
+        {
+            dbNameToAddr(name.c_str(), &addr_);
+        }
+
+        DBEntry(channel_name name, ValidateAddress tag)
+        {
+            auto status = dbNameToAddr(name.c_str(), &addr_);
+            if ( status )
+            {
+                throw std::runtime_error("Failure with PV lookup in the EPICS "
+                                          "database. If this is the first PV "
+                                          "this usually signifies an error "
+                                          "with the .cmd passed to iocsh(), "
+                                          "or a misconfigured EPICS "
+                                          "environment");
+            }
+        }
+
+        DBEntry(channel_name name, const char* val)
+        {
+            static_assert(DataType == DBF_STRING, "Initialization by const char* must be on a string type");
+            dbNameToAddr(name.c_str(), &addr_);
+            dbPutField(&addr_, DataType, reinterpret_cast<const void*>(val), 1);
+        }
+
+
+        DBEntry(channel_name name, const value_type& val)
+        {
+            dbNameToAddr(name.c_str(), &addr_);
+            dbPutField(&addr_, DataType, reinterpret_cast<const void*>(&val), 1);
+        }
+
+        void
+        set(const value_type& val)
+        {
+            dbPutField(&addr_, DataType, reinterpret_cast<const void*>(&val), 1);
+        }
+
+        void
+        set(const char* val)
+        {
+            static_assert(DataType == DBF_STRING, "Setting a const char* must be done on a string type");
+            dbPutField(&addr_, DataType, reinterpret_cast<const void*>(val), 1);
+        }
+
+        void
+        get(value_type& val)
+        {
+            long ropts{0};
+            long nvals{1};
+            dbGetField(&addr_, DataType, &val, &ropts, &nvals, nullptr);
+        }
+    private:
+
+
+        dbAddr addr_{};
+    };
+
+}
+
+#endif //DAQD_TRUNK_EPICS_CHANNEL_HH
diff --git a/src/epics/seq/fixed_size_string.hh b/src/epics/seq/fixed_size_string.hh
index 838be76b9..822db3116 100644
--- a/src/epics/seq/fixed_size_string.hh
+++ b/src/epics/seq/fixed_size_string.hh
@@ -29,6 +29,11 @@ namespace embedded
     public:
         typedef std::size_t size_type;
 
+        /**
+         * @brief the buffer object is a way to get raw access to manipulate the
+         * fixed_string.  It looses most protections of the fixed_string class, but
+         * ensures that the buffer is null terminated when the buffer is destroyed.
+         */
         class buffer
         {
             friend class fixed_string;
diff --git a/src/epics/seq/main.cc b/src/epics/seq/main.cc
index 8ecf5d66a..5d53bc1f8 100644
--- a/src/epics/seq/main.cc
+++ b/src/epics/seq/main.cc
@@ -19,6 +19,7 @@ of this distribution.
 /*
  * Main program for demo sequencer
  */
+#include "epics_channel.hh"
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
@@ -29,7 +30,9 @@ of this distribution.
 #include <errno.h>
 #include <ctype.h>
 #include <algorithm>
+#include <array>
 #include <iterator>
+#include <memory>
 
 #ifdef USE_SYSTEM_TIME
 #include <time.h>
@@ -229,7 +232,7 @@ int chNotFound = 0;		///< Total number of channels read from BURT file which did
 int chNotInit = 0;		///< Total number of channels not initialized by the safe.snap BURT file.
 int rderror = 0;
 #ifndef USE_SYSTEM_TIME
-char timechannel[256];		///< Name of the GPS time channel for timestamping.
+std::unique_ptr< epics::DBEntry< DBF_STRING > > timechannel{nullptr}; ///the GPS time channel for timestamping.
 #endif
 char reloadtimechannel[256];	///< Name of EPICS channel which contains the BURT reload requests.
 struct timespec t;
@@ -291,30 +294,28 @@ using ADDRESS = dbAddr;
 
 
 // Function prototypes		****************************************************************************************
-extern "C" {
-    int checkFileCrc(char *);
-}
+int checkFileCrc(const char *);
 bool isAlarmChannelRaw(const char *);
-int checkFileMod( char* , time_t* , int );
+int checkFileMod( const char* , time_t* , int );
 unsigned int filtCtrlBitConvert(unsigned int);
-void getSdfTime(char *, int size);
+void getSdfTime(embedded::fixed_string<256>&);
 void logFileEntry(const char *);
 void getEpicsSettings();
 
 template <std::size_t entry_count>
-bool writeTable2File(char *burtdir, char *filename, int ftype, fixed_size_vector<CDS_CD_TABLE, entry_count>& myTable);
+bool writeTable2File(const char *burtdir, const char *filename, int ftype, fixed_size_vector<CDS_CD_TABLE, entry_count>& myTable);
 
-int savesdffile(int,int,char *,char *,char *,char *,char *,dbAddr,dbAddr,dbAddr);
+int savesdffile(int,int,const char *,const char *,const char *,const char *,const char *,epics::DBEntry<DBF_STRING>&,epics::DBEntry<DBF_STRING>&,epics::DBEntry<DBF_STRING>&);
 int createSortTableEntries(int,int,const char *,int *,time_t*);
 template <std::size_t entry_count>
 int reportSetErrors(char *,fixed_size_vector<SET_ERR_TABLE, entry_count>&,int,int);
 template <std::size_t entry_count>
-int spChecker(int,fixed_size_vector<SET_ERR_TABLE, entry_count>&,int,char *,int,int *);
+int spChecker(int,fixed_size_vector<SET_ERR_TABLE, entry_count>&,int,const char *,int,int *);
 void newfilterstats();
 
 template <std::size_t entry_count>
 int writeEpicsDb(fixed_size_vector<CDS_CD_TABLE, entry_count>&,int);
-int readConfig( char *,char *,int,char *);
+int readConfig( const char *, const char *,int, const char *);
 int parseLine(char *, int,char *,char *,char *,char *,char *,char *);
 int modifyTable(table_range);
 template <std::size_t entry_count>
@@ -324,7 +325,7 @@ void clearTableSelections(fixed_size_vector<SET_ERR_TABLE, entry_count>& dcsErrT
 void setAllTableSelections(table_range, int *,int);
 void changeSelectCB_uninit(SET_ERR_TABLE&, int *);
 void decodeChangeSelect(int, int, table_range, int *, void (*)(SET_ERR_TABLE&, int *));
-int appendAlarms2File(char *,char *,char *);
+int appendAlarms2File(const char *,const char *,const char *);
 void registerFilters();
 void setupFMArrays(char *,fixed_size_vector<int, SDF_MAX_FMSIZE>&,
         fixed_size_vector<dbAddr, SDF_MAX_FMSIZE>&,
@@ -758,7 +759,7 @@ void decodeChangeSelect(int selNum, int page, table_range dcsErrTable, int selec
 
 // Check for file modification time changes
 int
-checkFileMod( char* fName, time_t* last_mod_time, int gettime )
+checkFileMod( const char* fName, time_t* last_mod_time, int gettime )
 {
     struct stat statBuf;
     if ( !stat( fName, &statBuf ) )
@@ -784,31 +785,30 @@ checkFileMod( char* fName, time_t* last_mod_time, int gettime )
     }
 }
 
-extern "C" {
-    /// Common routine to check file CRC.
-    ///	@param[in] *fName	Name of file to check.
-    ///	@return File CRC or -1 if file not found.
-    int checkFileCrc(char *fName) {
-        char cbuf[128];
-        char *cp;
-        int flen = 0;
-        int clen = 0;
-        unsigned int crc = 0;
-        FILE *fp = fopen(fName, "r");
-        if (fp == NULL) {
-            return 0;
-        }
+/// Common routine to check file CRC.
+///	@param[in] *fName	Name of file to check.
+///	@return File CRC or -1 if file not found.
+int checkFileCrc(const char *fName) {
+    char cbuf[128];
+    char *cp;
+    int flen = 0;
+    int clen = 0;
+    unsigned int crc = 0;
+    FILE *fp = fopen(fName, "r");
+    if (fp == NULL) {
+        return 0;
+    }
 
-        while ((cp = fgets(cbuf, 128, fp)) != NULL) {
-            clen = strlen(cbuf);
-            flen += clen;
-            crc = crc_ptr(cbuf, clen, crc);
-        }
-        crc = crc_len(flen, crc);
-        fclose(fp);
-        return crc;
+    while ((cp = fgets(cbuf, 128, fp)) != NULL) {
+        clen = strlen(cbuf);
+        flen += clen;
+        crc = crc_ptr(cbuf, clen, crc);
     }
+    crc = crc_len(flen, crc);
+    fclose(fp);
+    return crc;
 }
+
 /// Quick convert of filter switch settings to match SWMASK
 ///	@param[in] v	UINT32 representation of filter module switch setting.
 ///	@return Input value converted to 16 bit representation of filter switch settings.
@@ -891,7 +891,7 @@ void createSwitchText(FILTER_TABLE *filter, StringLike& dest) {
 /// @param[in] monitorAll	Global monitoring flag.
 /// @return	Number of errant switch settings found.
 template <std::size_t entry_count>
-int checkFilterSwitches(fixed_size_vector<SET_ERR_TABLE, entry_count>& setErrTable, int monitorAll, int displayall, int wcflag, char *wcstr, int *diffcntr)
+int checkFilterSwitches(fixed_size_vector<SET_ERR_TABLE, entry_count>& setErrTable, int monitorAll, int displayall, int wcflag, const char *wcstr, int *diffcntr)
 {
 unsigned int refVal=0;
 unsigned int presentVal=0;
@@ -1000,7 +1000,7 @@ long status=0;
 /// Routine for reading and formatting the time as a string.
 ///	@param[out] timestring 	Pointer to char string in which GPS time is to be written.
 /// @note This can use the GPS time from the model, or if configured with USE_SYSTEM_TIME the system time.
-void getSdfTime(char *timestring, int size)
+void getSdfTime(embedded::fixed_string<256>& timestring)
 {
 #ifdef USE_SYSTEM_TIME
 	time_t t=0;
@@ -1008,19 +1008,16 @@ void getSdfTime(char *timestring, int size)
 
 	t = time(NULL);
 	localtime_r(&t, &tdata);
-	if (timestring && size > 0) {
-		if (strftime(timestring, size, "%a %b %e %H:%M:%S %Y", &tdata) == 0) {
-			timestring[0] = '\0';
-		}
-	}
+
+    auto buf = timestring.get_buffer();
+    strftime(buf.data(), buf.capacity(), "%a %b %e %H:%M:%S %Y", &tdata);
 #else
 	dbAddr paddr;
 	long ropts = 0;
 	long nvals = 1;
 	long status;
 
-	status = dbNameToAddr(timechannel,&paddr);
-	status = dbGetField(&paddr,DBR_STRING,timestring,&ropts,&nvals,NULL);
+    timechannel->get(timestring);
 #endif
 }
 
@@ -1029,11 +1026,11 @@ void getSdfTime(char *timestring, int size)
 void logFileEntry(const char *message)
 {
 	FILE *log=0;
-	char timestring[256];
+	embedded::fixed_string<256> timestring{};
 	long status=0;
 	dbAddr paddr;
 
-	getSdfTime(timestring, 256);
+	getSdfTime(timestring);
 	log = fopen(logfilename,"a");
 	if(log == NULL) {
 		status = dbNameToAddr(reloadtimechannel,&paddr);
@@ -1110,15 +1107,15 @@ void encodeBURTString(const char *src, char *dest, int dest_size) {
 #define SDF_FILE_BURT_ONLY	2
 /// Common routine for saving table data to BURT files.
 template <std::size_t entry_count>
-bool writeTable2File(char *burtdir,
-                     char *filename, 		///< Name of file to write
+bool writeTable2File(const char *burtdir,
+                     const char *filename, 		///< Name of file to write
 		    int ftype, 			///< Type of file to write
 		    fixed_size_vector<CDS_CD_TABLE, entry_count>& myTable)	///< Table to be written.
 {
         int ii;
         FILE *csFile=0;
         char filemsg[128];
-	char timestring[128];
+	embedded::fixed_string<256> timestring;
 	char monitorstring[128];
 	char burtString[64+2];
 #ifdef CA_SDF
@@ -1137,9 +1134,9 @@ bool writeTable2File(char *burtdir,
 	    return(false);
         }
 	// Write BURT header
-	getSdfTime(timestring, 128);
+	getSdfTime(timestring);
 	fprintf(csFile,"%s\n","--- Start BURT header");
-	fprintf(csFile,"%s%s\n","Time:      ",timestring);
+	fprintf(csFile,"%s%s\n","Time:      ",timestring.c_str());
 	fprintf(csFile,"%s\n","Login ID: controls ()");
 	fprintf(csFile,"%s\n","Eff  UID: 1001 ");
 	fprintf(csFile,"%s\n","Group ID: 1001 ");
@@ -1207,9 +1204,9 @@ bool writeTable2File(char *burtdir,
 ///	@param[in] sdffile	Name of the file being saved.
 ///	@param[in] currentload	Base file name of the associated alarms.snap file..
 int appendAlarms2File(
-		char *sdfdir,
-		char *sdffile,
-		char *currentload
+		const char *sdfdir,
+		const char *sdffile,
+		const char *currentload
 		)
 {
 char sdffilename[256];
@@ -1252,23 +1249,23 @@ int lderror = 0;
 /// Routine used to decode and handle BURT save requests.
 int savesdffile(int saveType, 		///< Save file format definition.
 		int saveOpts, 		///< Save file options.
-		char *sdfdir, 		///< Directory to save file in.
-		char *model, 		///< Name of the model used to build file name.
-		char *currentfile, 	///< Name of file last read (Used if option is to overwrite).
-		char *saveasfile,	///< Name of file to be saved.
-		char *currentload,	///< Name of file, less directory info.
-		dbAddr sfaddr,		///< Address of EPICS channel to write save file name.
-		dbAddr staddr,		///< Address of EPICS channel to write save file time.
-		dbAddr rladdr)
+		const char *sdfdir, 		///< Directory to save file in.
+		const char *model, 		///< Name of the model used to build file name.
+		const char *currentfile, 	///< Name of file last read (Used if option is to overwrite).
+		const char *saveasfile,	///< Name of file to be saved.
+		const char *currentload,	///< Name of file, less directory info.
+		epics::DBEntry<DBF_STRING>& save_file_entry,		///< Address of EPICS channel to write save file name.
+		epics::DBEntry<DBF_STRING>& save_time_entry,		///< Address of EPICS channel to write save file time.
+		epics::DBEntry<DBF_STRING>& reload_time_entry)
 {
 char filename[256];
 char ftype[16];
 int status;
 char filemsg[128];
-char timestring[64];
-char shortfilename[64];
+embedded::fixed_string<256> timestring{};
+embedded::fixed_string<256> shortfilename{};
 
-	time_t now = time(NULL);
+	time_t now = time(nullptr);
 	struct tm *mytime  = localtime(&now);
 
 	switch(saveOpts)
@@ -1276,29 +1273,29 @@ char shortfilename[64];
 		case SAVE_TIME_NOW:
 			sprintf(filename,"%s%s_%d%02d%02d_%02d%02d%02d.snap", sdfdir,currentload,
 			(mytime->tm_year - 100),  (mytime->tm_mon + 1),  mytime->tm_mday,  mytime->tm_hour,  mytime->tm_min,  mytime->tm_sec);
-			sprintf(shortfilename,"%s_%d%02d%02d_%02d%02d%02d", currentload,
+            shortfilename.printf("%s_%d%02d%02d_%02d%02d%02d", currentload,
 			(mytime->tm_year - 100),  (mytime->tm_mon + 1),  mytime->tm_mday,  mytime->tm_hour,  mytime->tm_min,  mytime->tm_sec);
 			// printf("File to save is TIME NOW: %s\n",filename);
 			break;
 		case SAVE_OVERWRITE:
 			sprintf(filename,"%s",currentfile);
-			sprintf(shortfilename,"%s",currentload);
+			shortfilename.printf("%s",currentload);
 			// printf("File to save is OVERWRITE: %s\n",filename);
 			break;
 		case SAVE_BACKUP:
 			sprintf(filename,"%s%s_%d%02d%02d_%02d%02d%02d.snap",sdfdir,currentload,
 			(mytime->tm_year - 100),  (mytime->tm_mon + 1),  mytime->tm_mday,  mytime->tm_hour,  mytime->tm_min,  mytime->tm_sec);
-			sprintf(shortfilename,"%s",currentload);
+			shortfilename.printf("%s",currentload);
 			// printf("File to save is BACKUP: %s\n",filename);
 			break;
 		case SAVE_OVERWRITE_TABLE:
 			sprintf(filename,"%s%s.snap",sdfdir,currentload);
-			sprintf(shortfilename,"%s",currentload);
+			shortfilename.printf("%s",currentload);
 			// printf("File to save is BACKUP OVERWRITE: %s\n",filename);
 			break;
 		case SAVE_AS:
 			sprintf(filename,"%s%s.snap",sdfdir,saveasfile);
-			sprintf(shortfilename,"%s",saveasfile);
+			shortfilename.printf("%s",saveasfile);
 			// printf("File to save is SAVE_AS: %s\n",filename);
 			break;
 
@@ -1315,7 +1312,7 @@ char shortfilename[64];
 			    logFileEntry(filemsg);
                             return(-2);
 			}
-			status = appendAlarms2File(sdfdir,shortfilename,currentload);
+			status = appendAlarms2File(sdfdir,shortfilename.c_str(),currentload);
 			if(status != 0) {
                             sprintf(filemsg,"FAILED To Append Alarms -  %s",currentload);
 			    logFileEntry(filemsg);
@@ -1339,11 +1336,11 @@ char shortfilename[64];
 			return(-1);
 	}
 	logFileEntry(filemsg);
-	getSdfTime(timestring, 128);
+	getSdfTime(timestring);
 	// printf(" Time of save = %s\n",timestring);
-	status = dbPutField(&sfaddr,DBR_STRING,shortfilename,1);
-	status = dbPutField(&staddr,DBR_STRING,timestring,1);
-	status = dbPutField(&rladdr,DBR_STRING,timestring,1);
+    save_file_entry.set(shortfilename);
+	save_time_entry.set(timestring);
+	reload_time_entry.set(timestring);
 	return(0);
 
 	// I can type above your caret
@@ -1708,7 +1705,7 @@ int minusOne = -1;
 //	- Time the present setting was applied.
 /// Setpoint monitoring routine.
 template <std::size_t entry_count>
-int spChecker(int monitorAll, fixed_size_vector<SET_ERR_TABLE, entry_count>& setErrTable,int wcVal, char *wcstring, int listAll, int *totalDiffs)
+int spChecker(int monitorAll, fixed_size_vector<SET_ERR_TABLE, entry_count>& setErrTable,int wcVal, const char *wcstring, int listAll, int *totalDiffs)
 {
    	int errCntr = 0;
 	ADDRESS paddr;
@@ -2031,10 +2028,10 @@ int writeEpicsDb(fixed_size_vector<CDS_CD_TABLE, entry_count>& myTable,	///< Tab
 
 
 /// Function to read BURT files and load data into local tables.
-int readConfig( char *pref,		///< EPICS channel prefix from EPICS environment.
-		char *sdfile, 		///< Name of the file to read.
+int readConfig( const char *pref,		///< EPICS channel prefix from EPICS environment.
+		const char *sdfile, 		///< Name of the file to read.
 		int command,		///< Read file request type.
-		char *alarmfile)
+		const char *alarmfile)
 {
 	FILE *cdf=0;
 	FILE *adf=0;
@@ -2050,7 +2047,7 @@ int readConfig( char *pref,		///< EPICS channel prefix from EPICS environment.
 	int ropts = 0;
 	int nvals = 1;
 	int starttime=0,totaltime=0;
-	char timestring[256];
+	embedded::fixed_string<256> timestring{};
 	char line[128];
 	char *fs=0;
 	char ifo[4];
@@ -2071,7 +2068,6 @@ int readConfig( char *pref,		///< EPICS channel prefix from EPICS environment.
     
 
 	s1[0]=s2[0]=s3[0]=s4[0]=s5[0]=s6[0]=s7[0]=s8[0]='\0';
-	timestring[0]='\0';
 	line[0]='\0';
 	ifo[0]='\0';
 	fname[0]=errMsg[0]='\0';
@@ -2081,7 +2077,7 @@ int readConfig( char *pref,		///< EPICS channel prefix from EPICS environment.
 	clock_gettime(CLOCK_REALTIME,&t);
 	starttime = t.tv_nsec;
 
-	getSdfTime(timestring, 256);
+	getSdfTime(timestring);
 
 	if(command == SDF_RESET) {
 		lderror = writeEpicsDb(cdTable,command);
@@ -2307,7 +2303,7 @@ int readConfig( char *pref,		///< EPICS channel prefix from EPICS environment.
 	}
 	logFileEntry(errMsg);
 	status = dbNameToAddr(reloadtimechannel,&reloadDbAddr);
-	status = dbPutField(&reloadDbAddr,DBR_STRING,timestring,1);
+	status = dbPutField(&reloadDbAddr,DBR_STRING,timestring.c_str(),1);
 	printf("Number of read errors = %d\n",rderror);
 	if(rderror) lderror = 2;
 	return(lderror);
@@ -3211,42 +3207,6 @@ void listLocalRecords(DBBASE *pdbbase) {
 /// Called on EPICS startup; This is generic EPICS provided function, modified for LIGO use.
 int main(int argc,char *argv[])
 {
-	// Addresses for SDF EPICS records.
-	dbAddr reload_addr;
-	dbAddr sdfname_addr;
-	dbAddr reloadstat_addr;
-	dbAddr loadedfile_addr;
-	dbAddr sperroraddr;
-	dbAddr alrmchcountaddr;
-#ifdef CA_SDF
-	dbAddr disconnectcountaddr;
-	dbAddr droppedcountaddr;
-#endif
-	dbAddr filesetcntaddr;
-	dbAddr fulldbcntaddr;
-	dbAddr monchancntaddr;
-	dbAddr tablesortreqaddr;
-	dbAddr wcreqaddr;
-	dbAddr chnotfoundaddr;
-	dbAddr chnotinitaddr;
-	dbAddr sorttableentriesaddr;
-	dbAddr monflagaddr;
-	dbAddr reloadtimeaddr;
-	dbAddr rcgversion_addr;
-	dbAddr msgstraddr;
-	dbAddr edbloadedaddr;
-	dbAddr savecmdaddr;
-	dbAddr saveasaddr;
-	dbAddr wcstringaddr;
-	dbAddr savetypeaddr;
-	dbAddr saveoptsaddr;
-	dbAddr savefileaddr;
-	dbAddr savetimeaddr;
-	dbAddr daqmsgaddr;
-	dbAddr coeffmsgaddr;
-	dbAddr resetoneaddr;
-	dbAddr selectaddr[4];
-	dbAddr pagelockaddr[3];	// why is this an array of 3.  It looks like we can make this a single value
 #ifdef CA_SDF
 	// CA_SDF does not do a partial load on startup.
 	int sdfReq = SDF_READ_ONLY;
@@ -3260,8 +3220,8 @@ int main(int argc,char *argv[])
 	long nvals = 1;
 	int rdstatus = 0;
 	int burtstatus = 0;
-	char loadedSdf[256];
-	char sdffileloaded[256];
+	embedded::fixed_string<256> loadedSdf{};
+	embedded::fixed_string<256> sdffileloaded{};
    	int sperror = 0;
 	int noMon = 0;
 	int noInit = 0;
@@ -3274,9 +3234,9 @@ int main(int argc,char *argv[])
 	int monFlag = 0;
 	int sdfSaveReq = 0;
 	int saveType = 0;
-	char saveTypeString[64];
+	embedded::fixed_string<256> saveTypeString{};
 	int saveOpts = 0;
-	char saveOptsString[64];
+    embedded::fixed_string<256> saveOptsString{};
 	int fivesectimer = 0;
 	long daqFileCrc = 0;
 	long coeffFileCrc = 0;
@@ -3300,18 +3260,13 @@ int main(int argc,char *argv[])
 	int selectAll = 0;
 	int freezeTable = 0;
 	int zero = 0;
-	char backupName[64];
+	embedded::fixed_string<256> backupName{};
 	int lastTable = 0;
 	int cdSort = 0;
 	int diffCnt = 0;
-    	char errMsg[128];
+  	char errMsg[128];
 
-    loadedSdf[0] = '\0';
-    sdffileloaded[0] = '\0';
     tsrString[0] = '\0';
-    saveTypeString[0] = '\0';
-    saveOptsString[0] = '\0';
-    backupName[0] = '\0';
     errMsg[0] = '\0';
 
     if(argc>=2) {
@@ -3346,19 +3301,18 @@ int main(int argc,char *argv[])
 
 	if(stat(logdir, &st) == -1) mkdir(logdir,0777);
 	// strcat(sdf,"_safe");
-	char sdf[256];
-	char sdfile[256];
-	char sdalarmfile[256];
-	char bufile[256];
-	char saveasfilename[128];
-	char wcstring[64];
-	
-    strncpy(sdf, sdfenv, sizeof(sdf));
-    sdf[sizeof(sdf)-1] = '\0';
+	embedded::fixed_string<256> sdf;
+    embedded::fixed_string<256>  sdfile;
+	embedded::fixed_string<256>  sdalarmfile;
+	embedded::fixed_string<256>  bufile;
+    embedded::fixed_string<256>  saveasfilename;
+    embedded::fixed_string<256>  wcstring;
+
+    sdf = sdfenv;
 	
 	printf("My prefix is %s\n",pref);
-	sprintf(sdfile, "%s%s%s", sdfDir, sdf,".snap");					// Initialize with BURT_safe.snap
-	sprintf(bufile, "%s%s", sdfDir, "fec.snap");					// Initialize table dump file
+	sdfile.printf("%s%s%s", sdfDir, sdf.c_str(), ".snap");  // Initialize with BURT_safe.snap
+	bufile.printf("%s%s", sdfDir, "fec.snap");					// Initialize table dump file
 	sprintf(logfilename, "%s%s", logdir, "/ioc.log");					// Initialize table dump file
 	printf("SDF FILE = %s\n",sdfile);
 	printf("CURRENt FILE = %s\n",bufile);
@@ -3370,136 +3324,76 @@ int main(int argc,char *argv[])
 	int myreleased = RCG_VERSION_REL;
 	double myversion;
 
+    auto common_name = [pref](const char* name) -> epics::channel_name {
+        return epics::make_name(pref, name);
+    };
+
+
 	SETUP();
+#ifndef USE_SYSTEM_TIME
+        timechannel = std::make_unique< epics::DBEntry< DBF_STRING > >( common_name("TIME_STRING") );
+#endif
 	// listLocalRecords(*iocshPpdbbase);
 	myversion = majorversion + 0.1 * subversion1 + 0.01 * subversion2;
-	if(!myreleased) myversion *= -1.0;
-	char rcgversionname[256]; sprintf(rcgversionname, "%s_%s", pref, "RCG_VERSION");	// Set RCG Version EPICS
-	status = dbNameToAddr(rcgversionname,&rcgversion_addr);
-    if( status )
-    {
-        fprintf(stderr, "*\nFATAL: The address for the %s variable could not be "
-                        "located in the EPICS database. \n", rcgversionname);
-        fprintf(stderr, "Failure with first lookup in the EPICS database, "
-                        "this usually signifies an error with the .cmd passed to iocsh(), "
-                        "or a misconfigured EPCS environment.\n*\n");
-        return -1;
-    }
-	status = dbPutField(&rcgversion_addr,DBR_DOUBLE,&myversion,1);
-
-	// Create BURT/SDF EPICS channel names
-	char reloadChan[256]; sprintf(reloadChan, "%s_%s", pref, "SDF_RELOAD");		// Request to load new BURT
-	// Set request to load safe.snap on startup
-	status = dbNameToAddr(reloadChan,&reload_addr);
-	status = dbPutField(&reload_addr,DBR_LONG,&sdfReq,1);		// Init request for startup.
-
-	char reloadStat[256]; sprintf(reloadStat, "%s_%s", pref, "SDF_RELOAD_STATUS");	// Status of last reload
-	status = dbNameToAddr(reloadStat,&reloadstat_addr);
-	status = dbPutField(&reloadstat_addr,DBR_LONG,&rdstatus,1);	// Init to zero.
+	if(!myreleased)
+        {
+            myversion *= -1.0;
+        }
+	epics::DBEntry<DBF_DOUBLE> rcgversion_channel(common_name("RCG_VERSION"), myversion);
+        rcgversion_channel.set( myversion );
 
-	char sdfFileName[256]; sprintf(sdfFileName, "%s_%s", pref, "SDF_NAME");		// Name of file to load next request
-	// Initialize BURT file to be loaded next request = safe.snap
-	status = dbNameToAddr(sdfFileName,&sdfname_addr);		// Get Address
-	status = dbPutField(&sdfname_addr,DBR_STRING,sdf,1);		// Init to safe.snap
 
-	char loadedFile[256]; sprintf(loadedFile, "%s_%s", pref, "SDF_LOADED");		// Name of file presently loaded
-	status = dbNameToAddr(loadedFile,&loadedfile_addr);		//Get Address
+	// Create BURT/SDF EPICS channel names
 
-	char edbloadedFile[256]; sprintf(edbloadedFile, "%s_%s", pref, "SDF_LOADED_EDB");	// Name of file presently loaded
-	status = dbNameToAddr(edbloadedFile,&edbloadedaddr);		// Get Address
+    epics::DBEntry<DBF_LONG> reload_channel(common_name("SDF_RELOAD"), sdfReq); // Init request for startup.
+    epics::DBEntry<DBF_LONG> reload_stat( common_name("SDF_RELOAD_STATUS"), rdstatus); // Init to zero
 
-	char speStat[256]; sprintf(speStat, "%s_%s", pref, "SDF_DIFF_CNT");		// Setpoint diff counter
-	status = dbNameToAddr(speStat,&sperroraddr);			// Get Address
-	status = dbPutField(&sperroraddr,DBR_LONG,&sperror,1);		// Init to zero.
+    // Initialize BURT file to be loaded next request = safe.snap
+    epics::DBEntry<DBF_STRING> sdfname_channel(common_name("SDF_NAME"), sdf);
 
-	char spaStat[256]; sprintf(spaStat, "%s_%s", pref, "SDF_ALARM_CNT");		// Number of alarm settings in a BURT file.
-	status = dbNameToAddr(spaStat,&alrmchcountaddr);		// Get Address
-	status = dbPutField(&alrmchcountaddr,DBR_LONG,&alarmCnt,1);	// Init to zero.
+    epics::DBEntry<DBF_STRING> loadedfile_channel(common_name("SDF_LOADED"));
 
-	char fcc[256]; sprintf(fcc, "%s_%s", pref, "SDF_FULL_CNT");			// Number of setting channels in EPICS db
-	status = dbNameToAddr(fcc,&fulldbcntaddr);
+    epics::DBEntry<DBR_STRING> edbloaded_channel(common_name("SDF_LOADED_EDB"));	// Name of file presently loaded
 
-	char fsc[256]; sprintf(fsc, "%s_%s", pref, "SDF_FILE_SET_CNT");			// Number of settings inBURT file
-	status = dbNameToAddr(fsc,&filesetcntaddr);
+	epics::DBEntry<DBR_LONG> sperror_channel(common_name("SDF_DIFF_CNT"), sperror); // Setpoint diff counter
+    epics::DBEntry<DBR_LONG> alrmchcount_channel(common_name("SDF_ALARM_CNT"), alarmCnt); // Number of alarm settings in a BURT file.
+    epics::DBEntry<DBR_LONG> fulldbcnt_channel(common_name("SDF_FULL_CNT"));// Number of setting channels in EPICS db
 
-	char mcc[256]; sprintf(mcc, "%s_%s", pref, "SDF_UNMON_CNT");			// Number of settings NOT being monitored.
-	status = dbNameToAddr(mcc,&monchancntaddr);
+    epics::DBEntry<DBR_LONG> filesetcnt_channel(common_name("SDF_FILE_SET_CNT")); // Number of settings inBURT file
+    epics::DBEntry<DBR_LONG> unmonchancnt_channel(common_name("SDF_UNMON_CNT")); // Number of settings NOT being monitored.
 
 #ifdef CA_SDF
-	char dsc[256]; sprintf(dsc, "%s_%s", pref, "SDF_DISCONNECTED_CNT");
-	status = dbNameToAddr(dsc,&disconnectcountaddr);
+    epics::DBEntry<DBR_LONG> disconnectcount_channel(common_name("SDF_DISCONNECTED_CNT"));
 
-	char dpdc[256]; sprintf(dpdc, "%s_%s", pref, "SDF_DROPPED_CNT");
-	status = dbNameToAddr(dpdc,&droppedcountaddr);
+    epics::DBEntry<DBR_LONG> droppedcount_channel(common_name("SDF_DROPPED_CNT"));
 #endif
 
-	char tsrname[256]; sprintf(tsrname, "%s_%s", pref, "SDF_SORT");			// SDF Table sorting request
-	status = dbNameToAddr(tsrname,&tablesortreqaddr);
-
-	char wcname[256]; sprintf(wcname, "%s_%s", pref, "SDF_WILDCARD");			// SDF Table sorting request
-	status = dbNameToAddr(wcname,&wcreqaddr);
-	status = dbPutField(&wcreqaddr,DBR_LONG,&zero,1);		// Init to zero.
-
-	char cnfname[256]; sprintf(cnfname, "%s_%s", pref, "SDF_DROP_CNT");		// Number of channels not found.
-	status = dbNameToAddr(cnfname,&chnotfoundaddr);
-
-	char cniname[256]; sprintf(cniname, "%s_%s", pref, "SDF_UNINIT_CNT");		// Number of channels not initialized.
-	status = dbNameToAddr(cniname,&chnotinitaddr);
+    epics::DBEntry<DBR_USHORT> tablesortreq_channel(common_name("SDF_SORT"));// SDF Table sorting request
+    epics::DBEntry<DBR_LONG> wcreq_channel(common_name("SDF_WILDCARD"), 0);               // SDF Table sorting request
+    epics::DBEntry<DBR_LONG> chnotfound_channel(common_name("SDF_DROP_CNT")); // Number of channels not found.
+    epics::DBEntry<DBR_LONG> chnotinit_channel(common_name("SDF_UNINIT_CNT"));// Number of channels not initialized.
+    epics::DBEntry<DBR_LONG> sorttableentries_channel(common_name("SDF_TABLE_ENTRIES")); // Number of entries in an SDF reporting table.
+    epics::DBEntry<DBR_LONG> monflag_channel(common_name("SDF_MON_ALL"), rdstatus); // Request to monitor all channels.
+    epics::DBEntry<DBR_LONG> savecmd_channel(common_name("SDF_SAVE_CMD"), rdstatus);	// SDF Save command.
+    epics::DBEntry<DBR_LONG> pagelock_channel(common_name("SDF_TABLE_LOCK"), freezeTable); // SDF Save command.
 
-	char stename[256]; sprintf(stename, "%s_%s", pref, "SDF_TABLE_ENTRIES");	// Number of entries in an SDF reporting table.
-	status = dbNameToAddr(stename,&sorttableentriesaddr);
-
-	char monflagname[256]; sprintf(monflagname, "%s_%s", pref, "SDF_MON_ALL");	// Request to monitor all channels.
-	status = dbNameToAddr(monflagname,&monflagaddr);		// Get Address.
-	status = dbPutField(&monflagaddr,DBR_LONG,&rdstatus,1);		// Init to zero.
-
-	char savecmdname[256]; sprintf(savecmdname, "%s_%s", pref, "SDF_SAVE_CMD");	// SDF Save command.
-	status = dbNameToAddr(savecmdname,&savecmdaddr);		// Get Address.
-	status = dbPutField(&savecmdaddr,DBR_LONG,&rdstatus,1);		// Init to zero.
-
-	char pagelockname[128]; sprintf(pagelockname, "%s_%s", pref, "SDF_TABLE_LOCK");	// SDF Save command.
-	status = dbNameToAddr(pagelockname,&(pagelockaddr[0]));		// Get Address.
-	status = dbPutField(&(pagelockaddr[0]),DBR_LONG,&freezeTable,1);		// Init to zero.
-
-	char saveasname[256]; sprintf(saveasname, "%s_%s", pref, "SDF_SAVE_AS_NAME");	// SDF Save as file name.
 	// Clear out the save as file name request
-	status = dbNameToAddr(saveasname,&saveasaddr);			// Get Address.
-	status = dbPutField(&saveasaddr,DBR_STRING,"default",1);	// Set as dummy 'default'
-
-	char wcstringname[256]; sprintf(wcstringname, "%s_%s", pref, "SDF_WC_STR");	// SDF Save as file name.
-	status = dbNameToAddr(wcstringname,&wcstringaddr);			// Get Address.
-	status = dbPutField(&wcstringaddr,DBR_STRING,"",1);		// Set as dummy 'default'
-
-	char savetypename[256]; sprintf(savetypename, "%s_%s", pref, "SDF_SAVE_TYPE");	// SDF Save file type.
-	status = dbNameToAddr(savetypename,&savetypeaddr);
-
-	char saveoptsname[256]; sprintf(saveoptsname, "%s_%s", pref, "SDF_SAVE_OPTS");	// SDF Save file options.
-	status = dbNameToAddr(saveoptsname,&saveoptsaddr);
-
-	char savefilename[256]; sprintf(savefilename, "%s_%s", pref, "SDF_SAVE_FILE");	// SDF Name of last file saved.
-	status = dbNameToAddr(savefilename,&savefileaddr);
-	status = dbPutField(&savefileaddr,DBR_STRING,"",1);
+    epics::DBEntry<DBR_STRING> saveas_channel(common_name("SDF_SAVE_AS_NAME"), epics::channel_name("default")); // Set as dummy 'default'
 
-	char savetimename[256]; sprintf(savetimename, "%s_%s", pref, "SDF_SAVE_TIME");	// SDF Time of last file save.
-	status = dbNameToAddr(savetimename,&savetimeaddr);
-	status = dbPutField(&savetimeaddr,DBR_STRING,"",1);
+	epics::DBEntry<DBR_STRING> wcstring_channel(common_name("SDF_WC_STR"), "");// SDF Save as file name.
 
-	char moddaqfilemsg[256]; sprintf(moddaqfilemsg, "%s_%s", pref, "MSGDAQ");	// Record to write if DAQ file changed.
-	status = dbNameToAddr(moddaqfilemsg,&daqmsgaddr);
+    epics::DBEntry<DBR_STRING> savetype_channel( common_name("SDF_SAVE_TYPE"));// SDF Save file type.
+    epics::DBEntry<DBR_STRING> saveopts_channel( common_name("SDF_SAVE_OPTS"));// SDF Save file options.
 
-	char modcoefffilemsg[128]; sprintf(modcoefffilemsg, "%s_%s", pref, "MSG2");	// Record to write if Coeff file changed.
-	status = dbNameToAddr(modcoefffilemsg,&coeffmsgaddr);
+    epics::DBEntry<DBF_STRING> savefile_channel(common_name("SDF_SAVE_FILE"), ""); // SDF Name of last file saved.
+    epics::DBEntry<DBF_STRING> savetime_channel( common_name("SDF_SAVE_TIME"), ""); // SDF Time of last file save.
+    epics::DBEntry<DBR_STRING> daqmsg_channel(common_name("MSGDAQ"));// Record to write if DAQ file changed.
+    epics::DBEntry<DBR_STRING> coeffmsg_channel(common_name("MSG2"));	// Record to write if Coeff file changed.
 
+    epics::DBEntry<DBR_STRING> msgstr_channel(common_name("SDF_MSG_STR"), "");// SDF Time of last file save.
 	char msgstrname[128]; sprintf(msgstrname, "%s_%s", pref, "SDF_MSG_STR");	// SDF Time of last file save.
-	status = dbNameToAddr(msgstrname,&msgstraddr);
-	status = dbPutField(&msgstraddr,DBR_STRING,"",1);
 
-#ifndef USE_SYSTEM_TIME
-	sprintf(timechannel,"%s_%s", pref, "TIME_STRING");
-	// printf("timechannel = %s\n",timechannel);
-#endif
-	sprintf(reloadtimechannel,"%s_%s", pref, "SDF_RELOAD_TIME");			// Time of last BURT reload
-	status = dbNameToAddr(reloadtimechannel,&reloadtimeaddr);
+    epics::DBEntry<DBF_STRING> reloadtime_channel(common_name("SDF_RELOAD_TIME"), ""); // Time of last BURT reload
 
 	int pageNum = 0;
 	int pageNumSet = 0;
@@ -3508,23 +3402,14 @@ int main(int argc,char *argv[])
         status = dbNameToAddr(pagereqname,&pagereqaddr);                // Get Address.
 
 	unsigned int resetNum = 0;
-	char resetOneName[256]; sprintf(resetOneName, "%s_%s", pref, "SDF_RESET_CHAN");	// SDF reset one value.
-	status = dbNameToAddr(resetOneName,&resetoneaddr);
-	status = dbPutField(&resetoneaddr,DBR_LONG,&resetNum,1);
-
-	char selectName[256]; 
-	sprintf(selectName, "%s_%s", pref, "SDF_SELECT_SUM0");	// SDF reset one value.
-	status = dbNameToAddr(selectName,&selectaddr[0]);
-	status = dbPutField(&selectaddr[0],DBR_LONG,&resetNum,1);
-	sprintf(selectName, "%s_%s", pref, "SDF_SELECT_SUM1");	// SDF reset one value.
-	status = dbNameToAddr(selectName,&selectaddr[1]);
-	status = dbPutField(&selectaddr[1],DBR_LONG,&resetNum,1);
-	sprintf(selectName, "%s_%s", pref, "SDF_SELECT_SUM2");	// SDF reset one value.
-	status = dbNameToAddr(selectName,&selectaddr[2]);
-	status = dbPutField(&selectaddr[2],DBR_LONG,&resetNum,1);
-	sprintf(selectName, "%s_%s", pref, "SDF_SELECT_ALL");	// SDF reset one value.
-	status = dbNameToAddr(selectName,&selectaddr[3]);
-	status = dbPutField(&selectaddr[3],DBR_LONG,&selectAll,1);
+    epics::DBEntry<DBR_ULONG> resetone_channel(common_name("SDF_RESET_CHAN"), resetNum);	// SDF reset one value.
+
+    std::array< epics::DBEntry<DBR_LONG>, 4> select_channel{
+            epics::DBEntry<DBR_LONG>(common_name("SDF_SELECT_SUM0"), 0),
+            epics::DBEntry<DBR_LONG>(common_name("SDF_SELECT_SUM1"), 0),
+            epics::DBEntry<DBR_LONG>(common_name("SDF_SELECT_SUM2"), 0),
+            epics::DBEntry<DBR_LONG>(common_name("SDF_SELECT_SELECT_ALL"), selectAll),
+    };
 
 	dbAddr confirmwordaddr;
 	char confirmwordname[64]; 
@@ -3571,7 +3456,7 @@ int main(int argc,char *argv[])
 	reportSetErrors(pref,setErrTable,0,1);
 
 	sleep(1);       // Need to wait before first restore to allow sequencers time to do their initialization.
-	cdSort = spChecker(monFlag,cdTableList,wcVal,wcstring,1,&status);
+	cdSort = spChecker(monFlag,cdTableList,wcVal,wcstring.c_str(),1,&status);
 
 	// Start Infinite Loop 		*******************************************************************************
 	for(;;) {
@@ -3582,119 +3467,142 @@ int main(int argc,char *argv[])
 			// see bug 965
 			ca_poll();
 			syncCAConnections(NULL);
-			status = dbPutField(&disconnectcountaddr,DBR_LONG,&chDisconnectedCount,1);
-			status = dbPutField(&droppedcountaddr,DBR_LONG,&droppedPVCount,1); 
+            disconnectcount_channel.set(chDisconnectedCount);
+            droppedcount_channel.set(droppedPVCount);
 		}
 #endif
 		fivesectimer = (fivesectimer + 1) % 50;		// Increment 5 second timer for triggering CRC checks.
 		// Check for reload request
-		status = dbGetField(&reload_addr,DBR_LONG,&request,&ropts,&nvals,NULL);
+        reload_channel.get(request);
+
 		// Get BURT Read File Name
-		status = dbNameToAddr(sdfFileName,&sdfname_addr);
-		status = dbGetField(&sdfname_addr,DBR_STRING,sdf,&ropts,&nvals,NULL);
+        sdfname_channel.get(sdf);
+		////status = dbNameToAddr(sdfFileName,&sdfname_addr);
+		////status = dbGetField(&sdfname_addr,DBR_STRING,sdf,&ropts,&nvals,NULL);
 
 		//  Create full filename including directory and extension.
-		sprintf(sdfile, "%s%s%s", sdfDir, sdf,".snap");
-		sprintf(sdalarmfile, "%s%s%s", sdfDir, sdf,"_alarms.snap");
+        sdfile.printf("%s%s%s", sdfDir, sdf.c_str(), ".snap");
+        sdalarmfile.printf("%s%s%s", sdfDir, sdf.c_str(), "_alarms.snap");
+
 		// Check if file name != to one presently loaded
-		if(strcmp(sdf,loadedSdf) != 0) burtstatus |= 1;
-		else burtstatus &= ~(1);
-		if(burtstatus == 0)
-				status = dbPutField(&msgstraddr,DBR_STRING," ",1);
-		if(burtstatus == 1)
-				status = dbPutField(&msgstraddr,DBR_STRING,"New SDF File Pending",1);
-		if(burtstatus & 2)
-				status = dbPutField(&msgstraddr,DBR_STRING,"Read Error: Errant line(s) in file",1);
-		if(burtstatus & 4)
-				status = dbPutField(&msgstraddr,DBR_STRING,"Read Error: File Not Found",1);
+
+        if (sdf != loadedSdf) {
+            burtstatus |= 1;
+        }
+        else
+        {
+            burtstatus &= ~(1);
+        }
+		//if(strcmp(sdf,loadedSdf) != 0) burtstatus |= 1;
+		//else burtstatus &= ~(1);
+
+		if(burtstatus == 0) {
+            msgstr_channel.set(" ");
+        }
+		if(burtstatus == 1) {
+            msgstr_channel.set("New SDF File Pending");
+        }
+		if(burtstatus & 2) {
+            msgstr_channel.set("Read Error: Errant line(s) in file");
+        }
+		if(burtstatus & 4) {
+            msgstr_channel.set("Read Error: File Not Found");
+        }
 		if(request != 0) {		// If there is a read file request, then:
-			status = dbPutField(&reload_addr,DBR_LONG,&ropts,1);	// Clear the read request.
+			reload_channel.set(ropts);
 			reqValid = 1;
 			if(reqValid) {
-				rdstatus = readConfig(pref,sdfile,request,sdalarmfile);
+				rdstatus = readConfig(pref,sdfile.c_str(),request,sdalarmfile.c_str());
 				resyncFMArrays(filterMasks,fmMaskChan);
 				if (rdstatus) burtstatus |= rdstatus;
 				else burtstatus &= ~(6);
 				if(burtstatus < 4) {
 					switch (request){
 						case SDF_LOAD_DB_ONLY:
-							strcpy(loadedSdf,sdf); 
-							status = dbPutField(&edbloadedaddr,DBR_STRING,loadedSdf,1);
+                            loadedSdf = sdf;
+                            edbloaded_channel.set(loadedSdf);
 							break;
 						case SDF_RESET:
 							break;
 						case SDF_LOAD_PARTIAL:
-							strcpy(loadedSdf,sdf); 
-							status = dbPutField(&loadedfile_addr,DBR_STRING,loadedSdf,1);
-							status = dbPutField(&edbloadedaddr,DBR_STRING,loadedSdf,1);
+							loadedSdf = sdf;
+                            loadedfile_channel.set(loadedSdf);
+                            edbloaded_channel.set(loadedSdf);
 							break;
 						case SDF_READ_ONLY:
-							strcpy(loadedSdf,sdf); 
-							status = dbPutField(&loadedfile_addr,DBR_STRING,loadedSdf,1);
+							loadedSdf = sdf;
+                            loadedfile_channel.set(loadedSdf);
 							break;
 						default:
 							logFileEntry("Invalid READ Request");
 							reqValid = 0;
 							break;
 					}
-					status = dbPutField(&reloadstat_addr,DBR_LONG,&rdstatus,1);
+                    reload_stat.set(rdstatus);
 					// Get the file CRC for later checking if file changed.
-					sprintf(sdffileloaded, "%s%s%s", sdfDir, loadedSdf,".snap");
-					sdfFileCrc = checkFileCrc(sdffileloaded);
+					sdffileloaded.printf("%s%s%s", sdfDir, loadedSdf.c_str(), ".snap");
+					sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
                     // Get the file mod time
-                    status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
+                    status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
 					// Calculate and report the number of settings in the BURT file.
 					setChans = chNumP - alarmCnt;
-					status = dbPutField(&filesetcntaddr,DBR_LONG,&setChans,1);
+                    filesetcnt_channel.set(setChans);
 					// Report number of settings in the main table.
 					setChans = chNum - fmNum;
-					status = dbPutField(&fulldbcntaddr,DBR_LONG,&setChans,1);
+                    fulldbcnt_channel.set(setChans);
 					// Sort channels for data reporting via the MEDM table.
 					getEpicsSettings();
 					noMon = createSortTableEntries(chNum,0,"",&noInit,NULL);
 					// Calculate and report number of channels NOT being monitored.
-					status = dbPutField(&monchancntaddr,DBR_LONG,&chNotMon,1);
-					status = dbPutField(&alrmchcountaddr,DBR_LONG,&alarmCnt,1);
+					unmonchancnt_channel.set(chNotMon);
+					alrmchcount_channel.set(alarmCnt);
 					// Report number of channels in BURT file that are not in local database.
-					status = dbPutField(&chnotfoundaddr,DBR_LONG,&chNotFound,1);
+					chnotfound_channel.set(chNotFound);
 					// Report number of channels that have not been initialized via a BURT read.
-					status = dbPutField(&chnotinitaddr,DBR_LONG,&chNotInit,1);
+					chnotinit_channel.set(chNotInit);
 					// Write out local monitoring table as snap file.
-					writeTable2File(sdfDir,bufile,SDF_WITH_INIT_FLAG,cdTable);
+					writeTable2File(sdfDir,bufile.c_str(),SDF_WITH_INIT_FLAG,cdTable);
 				}
 			}
 		}
-		status = dbPutField(&reloadstat_addr,DBR_LONG,&burtstatus,1);
+        reload_stat.set(burtstatus);
+
 		// sleep(1);
 		// Check for SAVE requests
-		status = dbGetField(&savecmdaddr,DBR_LONG,&sdfSaveReq,&ropts,&nvals,NULL);
+        savecmd_channel.get(sdfSaveReq);
 		if(sdfSaveReq)	// If there is a SAVE file request, then:
 		{
 			// Clear the save file request
-			status = dbPutField(&savecmdaddr,DBR_LONG,&ropts,1);
+            savecmd_channel.set(ropts);
 			// Determine file type
-			status = dbGetField(&savetypeaddr,DBR_STRING,saveTypeString,&ropts,&nvals,NULL);
+            savetype_channel.get(saveTypeString);
 			saveType = 0;
-                        if(strcmp(saveTypeString,"TABLE TO FILE") == 0) saveType = SAVE_TABLE_AS_SDF;
-                        if(strcmp(saveTypeString,"EPICS DB TO FILE") == 0) saveType = SAVE_EPICS_AS_SDF;
+            if(saveTypeString == "TABLE TO FILE") {
+                saveType = SAVE_TABLE_AS_SDF;
+            }
+            if(saveTypeString == "EPICS DB TO FILE") {
+                saveType = SAVE_EPICS_AS_SDF;
+            }
 			// Determine file options
                         saveOpts = 0;
-			status = dbGetField(&saveoptsaddr,DBR_STRING,saveOptsString,&ropts,&nvals,NULL);
-                        if(strcmp(saveOptsString,"TIME NOW") == 0) saveOpts = SAVE_TIME_NOW;
-                        if(strcmp(saveOptsString,"OVERWRITE") == 0) saveOpts = SAVE_OVERWRITE;
-                        if(strcmp(saveOptsString,"SAVE AS") == 0) saveOpts = SAVE_AS;
+			saveopts_channel.get(saveOptsString);
+            if(saveOptsString == "TIME NOW") saveOpts = SAVE_TIME_NOW;
+            if(saveOptsString == "OVERWRITE") saveOpts = SAVE_OVERWRITE;
+            if(saveOptsString == "SAVE AS") saveOpts = SAVE_AS;
 			// Determine if request is valid.
 			if(saveType && saveOpts)
 			{
 				// Get saveas filename
-				status = dbGetField(&saveasaddr,DBR_STRING,saveasfilename,&ropts,&nvals,NULL);
-				if(saveOpts == SAVE_OVERWRITE) 
-					savesdffile(saveType,SAVE_TIME_NOW,sdfDir,modelname,sdfile,saveasfilename,loadedSdf,savefileaddr,savetimeaddr,reloadtimeaddr);
+                saveas_channel.get(saveasfilename);
+				if(saveOpts == SAVE_OVERWRITE) {
+                    savesdffile(saveType, SAVE_TIME_NOW, sdfDir, modelname, sdfile.c_str(), saveasfilename.c_str(), loadedSdf.c_str(),
+                                savefile_channel, savetime_channel, reloadtime_channel);
+                }
 				// Save the file
-				savesdffile(saveType,saveOpts,sdfDir,modelname,sdfile,saveasfilename,loadedSdf,savefileaddr,savetimeaddr,reloadtimeaddr);
+				savesdffile(saveType,saveOpts,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),loadedSdf.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
 				if(saveOpts == SAVE_OVERWRITE)  {
-						sdfFileCrc = checkFileCrc(sdffileloaded);
-                        status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
+						sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
+                        status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
                 }
 			} else {
 				logFileEntry("Invalid SAVE File Request");
@@ -3702,20 +3610,20 @@ int main(int argc,char *argv[])
 		}
 		// Check present settings vs BURT settings and report diffs.
 		// Check if MON ALL CHANNELS is set
-		status = dbGetField(&monflagaddr,DBR_LONG,&monFlag,&ropts,&nvals,NULL);
-		status = dbGetField(&wcstringaddr,DBR_STRING,wcstring,&ropts,&nvals,NULL);
-		status = dbGetField(&wcstringaddr,DBR_STRING,saveasfilename,&ropts,&nvals,NULL);
+        monflag_channel.get(monFlag);
+		wcstring_channel.get(wcstring);
+		saveasfilename = wcstring;
 		// Call the diff checking function.
 		if(!freezeTable)
-			sperror = spChecker(monFlag,setErrTable,wcVal,wcstring,0,&diffCnt);
+			sperror = spChecker(monFlag,setErrTable,wcVal,wcstring.c_str(),0,&diffCnt);
 		// Report number of diffs found.
-		status = dbPutField(&sperroraddr,DBR_LONG,&diffCnt,1);
+        sperror_channel.set(diffCnt);
 		// Table sorting and presentation
-		status = dbGetField(&tablesortreqaddr,DBR_USHORT,&tsrVal,&ropts,&nvals,NULL);
-		status = dbGetField(&wcreqaddr,DBR_USHORT,&wcVal,&ropts,&nvals,NULL);
+        tablesortreq_channel.set(tsrVal);
+        wcreq_channel.set(wcVal);
 		status = dbGetField(&pagereqaddr,DBR_LONG,&pageNumSet,&ropts,&nvals,NULL);
 		status = dbGetField(&confirmwordaddr,DBR_LONG,&confirmVal,&ropts,&nvals,NULL);
-		status = dbGetField(&selectaddr[3],DBR_LONG,&selectAll,&ropts,&nvals,NULL);
+		select_channel[3].get(selectAll);
 		if(pageNumSet != 0) {
 			pageNum += pageNumSet;
 			if(pageNum < 0) pageNum = 0;
@@ -3733,8 +3641,8 @@ int main(int argc,char *argv[])
 				pageDisp = reportSetErrors(pref, setErrTable,pageNum,1);
 				currentTable = make_range(setErrTable);
 
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&sperror,1);
-				status = dbGetField(&resetoneaddr,DBR_LONG,&resetNum,&ropts,&nvals,NULL);
+                sorttableentries_channel.set(sperror);
+                resetone_channel.get(resetNum);
 				if(selectAll) {
 					setAllTableSelections(make_range(setErrTable), selectCounter,selectAll);
 				}
@@ -3745,25 +3653,25 @@ int main(int argc,char *argv[])
 					if(selectCounter[0] && (confirmVal & 2)) status = resetSelectedValues(setErrTable);
 					if((selectCounter[1] || selectCounter[2]) && (confirmVal & 2)) {
 						// Save present table as timenow.
-						status = dbGetField(&loadedfile_addr,DBR_STRING,backupName,&ropts,&nvals,NULL);
+                        loadedfile_channel.get(backupName);
 						// printf("BACKING UP: %s\n",backupName);
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile,saveasfilename,backupName,
-							    savefileaddr,savetimeaddr,reloadtimeaddr);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+                                    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
 						// Overwrite the table with new values
 						status = modifyTable(make_range(setErrTable));
 						// Overwrite file
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile,saveasfilename,
-							    backupName,savefileaddr,savetimeaddr,reloadtimeaddr);
-						sdfFileCrc = checkFileCrc(sdffileloaded);
-                        status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
-						writeTable2File(sdfDir,bufile,SDF_WITH_INIT_FLAG,cdTable);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+							    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
+						sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
+                        status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
+						writeTable2File(sdfDir,bufile.c_str(),SDF_WITH_INIT_FLAG,cdTable);
 					}
 					clearTableSelections(setErrTable, selectCounter);
 					resyncFMArrays(filterMasks,fmMaskChan);
 					confirmVal = 0;
 					status = dbPutField(&confirmwordaddr,DBR_LONG,&confirmVal,1);
-					noMon = createSortTableEntries(chNum,wcVal,wcstring,&noInit,NULL);
-					status = dbPutField(&monchancntaddr,DBR_LONG,&chNotMon,1);
+					noMon = createSortTableEntries(chNum,wcVal,wcstring.c_str(),&noInit,NULL);
+                    unmonchancnt_channel.set(chNotMon);
 				}
 				lastTable = SDF_TABLE_DIFFS;
 				break;
@@ -3777,7 +3685,7 @@ int main(int argc,char *argv[])
 				pageDisp = reportSetErrors(pref, unknownChans,pageNum,1);
 				currentTable = make_range(unknownChans);
 
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&chNotFound,1);
+                sorttableentries_channel.set(chNotFound);
 				/*if (resetNum > 200) {
 					decodeChangeSelect(resetNum, pageDisp, make_range(unknownChans),selectCounter, NULL);
 				}*/
@@ -3791,10 +3699,10 @@ int main(int argc,char *argv[])
 				}
 				if (!freezeTable)
 					getEpicsSettings();
-				noMon = createSortTableEntries(chNum,wcVal,wcstring,&noInit,NULL);
+				noMon = createSortTableEntries(chNum,wcVal,wcstring.c_str(),&noInit,NULL);
 				pageDisp = reportSetErrors(pref, uninitChans,pageNum,1);
 				currentTable = make_range(uninitChans);
-				status = dbGetField(&resetoneaddr,DBR_LONG,&resetNum,&ropts,&nvals,NULL);
+                resetone_channel.get(resetNum);
 				if(selectAll == 2 || selectAll == 3) {
 					setAllTableSelections(make_range(uninitChans),selectCounter,selectAll);
 					if (selectAll == 3)
@@ -3807,26 +3715,26 @@ int main(int argc,char *argv[])
 					if(selectCounter[0] && (confirmVal & 2)) status = resetSelectedValues(uninitChans);
 					if(selectCounter[1] && (confirmVal & 2)) {
 						// Save present table as timenow.
-						status = dbGetField(&loadedfile_addr,DBR_STRING,backupName,&ropts,&nvals,NULL);
+						loadedfile_channel.get(backupName);
 						// printf("BACKING UP: %s\n",backupName);
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile,saveasfilename,backupName,
-							    savefileaddr,savetimeaddr,reloadtimeaddr);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),backupName.c_str(),
+							    savefile_channel,savetime_channel,reloadtime_channel);
 						// Overwrite the table with new values
 						status = modifyTable(make_range(uninitChans));
 						// Overwrite file
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile,saveasfilename,
-							    backupName,savefileaddr,savetimeaddr,reloadtimeaddr);
-						sdfFileCrc = checkFileCrc(sdffileloaded);
-                        status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
-						writeTable2File(sdfDir,bufile,SDF_WITH_INIT_FLAG,cdTable);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+							    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
+						sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
+                        status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
+						writeTable2File(sdfDir,bufile.c_str(),SDF_WITH_INIT_FLAG,cdTable);
 					}
 					clearTableSelections(uninitChans, selectCounter);
 					resyncFMArrays(filterMasks,fmMaskChan);
 					confirmVal = 0;
 					status = dbPutField(&confirmwordaddr,DBR_LONG,&confirmVal,1);
 				}
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&noInit,1);
-				status = dbPutField(&chnotinitaddr,DBR_LONG,&chNotInit,1);
+                sorttableentries_channel.set(noInit);
+				chnotinit_channel.set(chNotInit);
 				lastTable = SDF_TABLE_NOT_INIT;
 				break;
 			case SDF_TABLE_NOT_MONITORED:
@@ -3839,11 +3747,11 @@ int main(int argc,char *argv[])
 				}
 				if (!freezeTable)
 					getEpicsSettings(); //timeTable);
-				noMon = createSortTableEntries(chNum,wcVal,wcstring,&noInit,NULL);//timeTable);
-				status = dbPutField(&monchancntaddr,DBR_LONG,&chNotMon,1);
+				noMon = createSortTableEntries(chNum,wcVal,wcstring.c_str(),&noInit,NULL);//timeTable);
+				unmonchancnt_channel.set(chNotMon);
 				pageDisp = reportSetErrors(pref, unMonChans,pageNum,1);
 				currentTable = make_range(unMonChans);
-				status = dbGetField(&resetoneaddr,DBR_LONG,&resetNum,&ropts,&nvals,NULL);
+                resetone_channel.get(resetNum);
 				if(selectAll) {
 					setAllTableSelections(make_range(unMonChans),selectCounter,selectAll);
 				}
@@ -3854,18 +3762,18 @@ int main(int argc,char *argv[])
 					if(selectCounter[0] && (confirmVal & 2)) status = resetSelectedValues(unMonChans);
 					if((selectCounter[1] || selectCounter[2]) && (confirmVal & 2)) {
 						// Save present table as timenow.
-						status = dbGetField(&loadedfile_addr,DBR_STRING,backupName,&ropts,&nvals,NULL);
+                        loadedfile_channel.get(backupName);
 						// printf("BACKING UP: %s\n",backupName);
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile,saveasfilename,backupName,
-							    savefileaddr,savetimeaddr,reloadtimeaddr);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),backupName.c_str(),
+							    savefile_channel,savetime_channel,reloadtime_channel);
 						// Overwrite the table with new values
 						status = modifyTable(make_range(unMonChans));
 						// Overwrite file
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile,saveasfilename,
-							    backupName,savefileaddr,savetimeaddr,reloadtimeaddr);
-						sdfFileCrc = checkFileCrc(sdffileloaded);
-                        status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
-						writeTable2File(sdfDir,bufile,SDF_WITH_INIT_FLAG,cdTable);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+							    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
+						sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
+                        status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
+						writeTable2File(sdfDir,bufile.c_str(),SDF_WITH_INIT_FLAG,cdTable);
 					}
 					// noMon = createSortTableEntries(chNum,wcVal,wcstring);
 					clearTableSelections(unMonChans, selectCounter);
@@ -3874,7 +3782,7 @@ int main(int argc,char *argv[])
 					status = dbPutField(&confirmwordaddr,DBR_LONG,&confirmVal,1);
 					// Calculate and report number of channels NOT being monitored.
 				}
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&noMon,1);
+                sorttableentries_channel.set(noMon);
 				lastTable = SDF_TABLE_NOT_MONITORED;
 				break;
 			case SDF_TABLE_FULL:
@@ -3884,10 +3792,10 @@ int main(int argc,char *argv[])
 					confirmVal = 0;
 				}
 				if (!freezeTable)
-					cdSort = spChecker(monFlag,cdTableList,wcVal,wcstring,1,&status);
+					cdSort = spChecker(monFlag,cdTableList,wcVal,wcstring.c_str(),1,&status);
 				pageDisp = reportSetErrors(pref, cdTableList,pageNum,1);
 				currentTable = make_range(cdTableList);
-				status = dbGetField(&resetoneaddr,DBR_LONG,&resetNum,&ropts,&nvals,NULL);
+                resetone_channel.get(resetNum);
 				if(selectAll == 3) {
 					setAllTableSelections(make_range(cdTableList),selectCounter,selectAll);
 				}
@@ -3898,28 +3806,28 @@ int main(int argc,char *argv[])
 					if(selectCounter[0] && (confirmVal & 2)) status = resetSelectedValues(cdTableList);
 					if((selectCounter[1] || selectCounter[2]) && (confirmVal & 2)) {
 						// Save present table as timenow.
-						status = dbGetField(&loadedfile_addr,DBR_STRING,backupName,&ropts,&nvals,NULL);
+                        loadedfile_channel.get(backupName);
 						// printf("BACKING UP: %s\n",backupName);
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile,saveasfilename,
-							    backupName,savefileaddr,savetimeaddr,reloadtimeaddr);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_TIME_NOW,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+							    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
 						// Overwrite the table with new values
 						status = modifyTable(make_range(cdTableList));
 						// Overwrite file
-						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile,saveasfilename,
-							    backupName,savefileaddr,savetimeaddr,reloadtimeaddr);
-						sdfFileCrc = checkFileCrc(sdffileloaded);
-                        status = checkFileMod( sdffileloaded, &sdfFileMt, 1 );
-						writeTable2File(sdfDir,bufile,SDF_WITH_INIT_FLAG,cdTable);
+						savesdffile(SAVE_TABLE_AS_SDF,SAVE_OVERWRITE,sdfDir,modelname,sdfile.c_str(),saveasfilename.c_str(),
+							    backupName.c_str(),savefile_channel,savetime_channel,reloadtime_channel);
+						sdfFileCrc = checkFileCrc(sdffileloaded.c_str());
+                        status = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 1 );
+						writeTable2File(sdfDir,bufile.c_str(),SDF_WITH_INIT_FLAG,cdTable);
 					}
 					clearTableSelections(cdTableList, selectCounter);
 					resyncFMArrays(filterMasks,fmMaskChan);
 					confirmVal = 0;
 					status = dbPutField(&confirmwordaddr,DBR_LONG,&confirmVal,1);
-					noMon = createSortTableEntries(chNum,wcVal,wcstring,&noInit,NULL);
+					noMon = createSortTableEntries(chNum,wcVal,wcstring.c_str(),&noInit,NULL);
 					// Calculate and report number of channels NOT being monitored.
-					status = dbPutField(&monchancntaddr,DBR_LONG,&chNotMon,1);
+					unmonchancnt_channel.set(chNotMon);
 				}
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&cdSort,1);
+                sorttableentries_channel.set(cdSort);
 				lastTable = SDF_TABLE_FULL;
 				break;
 #ifdef CA_SDF
@@ -3933,7 +3841,7 @@ int main(int argc,char *argv[])
 				pageDisp =  reportSetErrors(pref, disconnectChans, pageNum,0);
 				chDisconnectedCount = chDisconnected;
 				currentTable = make_range(disconnectChans);
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&chDisconnected, 1);
+                sorttableentries_channel.set(chDisconnected);
 				if (resetNum > 200) {
 					decodeChangeSelect(resetNum, pageDisp, make_range(disconnectChans), selectCounter, NULL);
 				}
@@ -3941,17 +3849,17 @@ int main(int argc,char *argv[])
 #endif
 			default:
 				pageDisp = reportSetErrors(pref, setErrTable,pageNum,1);
-				status = dbPutField(&sorttableentriesaddr,DBR_LONG,&sperror,1);
+				sorttableentries_channel.set(sperror);
 				currentTable = make_range(setErrTable);
 				break;
 		}
 		if (selectAll) {
 			selectAll = 0;
-			status = dbPutField(&selectaddr[3],DBR_LONG,&selectAll,1);
+            select_channel[3].set(selectAll);
 		}
 		if (resetNum) {
 			resetNum = 0;
-			status = dbPutField(&resetoneaddr,DBR_LONG,&resetNum,1);
+            resetone_channel.set(resetNum);
 		}
 		if(pageDisp != pageNum) {
 			pageNum = pageDisp;
@@ -3959,9 +3867,9 @@ int main(int argc,char *argv[])
 		freezeTable = 0;
 		for(ii=0;ii<3;ii++) {
 			freezeTable += selectCounter[ii];
-			status = dbPutField(&selectaddr[ii],DBR_LONG,&selectCounter[ii],1);
+            select_channel[ii].set(selectCounter[ii]);
 		}
-		status = dbPutField(&(pagelockaddr[0]),DBR_LONG,&freezeTable,1);
+        pagelock_channel.set(freezeTable);
 
 		processFMChanCommands(filterMasks, fmMaskChan,fmMaskChanCtrl,selectCounter, currentTable);
 
@@ -3975,7 +3883,7 @@ int main(int argc,char *argv[])
 			status = checkFileCrc(daqFile);
 			if(status != daqFileCrc) {
 				daqFileCrc = status;
-				status = dbPutField(&daqmsgaddr,DBR_STRING,modfilemsg,1);
+                daqmsg_channel.set(modfilemsg);
 				logFileEntry("Detected Change to DAQ Config file.");
 			}
             }
@@ -3987,9 +3895,9 @@ int main(int argc,char *argv[])
 			coeffFileCrc = checkFileCrc(coeffFile);
 			fotonFileCrc = checkFileCrc(fotonFile);
 			if(fotonFileCrc != coeffFileCrc) {
-				status = dbPutField(&coeffmsgaddr,DBR_STRING,modfilemsg,1);
+                coeffmsg_channel.set(modfilemsg);
 			} else {
-				status = dbPutField(&coeffmsgaddr,DBR_STRING,"",1);
+                coeffmsg_channel.set("");
 			}
 			if(fotonFileCrc != prevFotonFileCrc || prevCoeffFileCrc != coeffFileCrc) {
 				sprintf(myDiffCmd,"%s %s %s %s %s","diff",fotonFile,coeffFile," > ",fotonDiffFile);
@@ -3999,19 +3907,18 @@ int main(int argc,char *argv[])
 			}
             }
             // Check SDF file modified
-            fm_flag = checkFileMod( sdffileloaded, &sdfFileMt, 0 );
+            fm_flag = checkFileMod( sdffileloaded.c_str(), &sdfFileMt, 0 );
             if ( fm_flag )
             {
-			status = checkFileCrc(sdffileloaded);
+			status = checkFileCrc(sdffileloaded.c_str());
 			if(status == -1) {
 				sdfFileCrc = status;
 				logFileEntry("SDF file not found.");
-				dbPutField(&reloadtimeaddr,DBR_STRING,"File Not Found",1);
-			} 
+			}
 			if(status != sdfFileCrc) {
 				sdfFileCrc = status;
 				logFileEntry("Detected Change to SDF file.");
-				dbPutField(&reloadtimeaddr,DBR_STRING,modfilemsg,1);
+				reloadtime_channel.set(modfilemsg);
 			}
             }
 		}
-- 
GitLab