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