From bd1054f247c65579f7add148622caf3e2de2b8e7 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Sat, 6 Mar 2021 14:14:39 -0500 Subject: [PATCH 01/20] Changes were to check for null pointer after calling lock on a weak pointer. --- src/pvAccess/channelLocal.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pvAccess/channelLocal.cpp b/src/pvAccess/channelLocal.cpp index 947d339..99acb7b 100644 --- a/src/pvAccess/channelLocal.cpp +++ b/src/pvAccess/channelLocal.cpp @@ -520,6 +520,7 @@ void ChannelPutLocal::put( ChannelPutRequester::shared_pointer requester = channelPutRequester.lock(); if(!requester) return; ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); if(!channel->canWrite()) { Status status = Status::error("Channel put is not allowed"); requester->putDone(status,getPtrSelf()); @@ -687,6 +688,7 @@ void ChannelPutGetLocal::putGet( ChannelPutGetRequester::shared_pointer requester = channelPutGetRequester.lock(); if(!requester) return; ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); if(!channel->canWrite()) { Status status = Status::error("Channel putGet is not allowed"); requester->putGetDone(status,getPtrSelf(),pvGetStructure,getBitSet); From dafc37b585d8c234d6137953419d9d53f83acd80 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Mon, 15 Mar 2021 07:04:32 -0400 Subject: [PATCH 02/20] The following changes were made: 1) PVRecord now has two new methods: setAsLevel and setAsGroup. 2) The following special records are DEPRECATED: addRecord,processRecord,removeRecord, and traceRecord. They are replaced by pvdbcrAddRecord,pvdbcrProcessRecord,pvdbcrRemoveRecord, and pvdbcrTraceRecord. 3) A new convention is that all special records start with pvdbcr, which means pvDatabase Create Record. 4) pvdbcrAddRecord,pvdbcrProcessRecord,pvdbcrRemoveRecord, and pvdbcrTraceRecord are like what they replace. But they also allow the asLevel to be set when they are created. 5) pvdbcrScalar and pvdbcrScalarArray are new special records. They created records that have fields value, alarm, and timeStamp. value can have any of the allowed scalar types, i.e. boolean,byte,...,string. --- src/Makefile | 6 + src/pv/pvDatabase.h | 10 ++ src/pv/pvdbcrAddRecord.h | 63 ++++++++ src/pv/pvdbcrProcessRecord.h | 89 +++++++++++ src/pv/pvdbcrRemoveRecord.h | 63 ++++++++ src/pv/pvdbcrTraceRecord.h | 66 ++++++++ src/special/Makefile | 19 +++ src/special/addRecordRegister.cpp | 1 + src/special/processRecordRegister.cpp | 1 + src/special/pvdbcrAddRecord.cpp | 116 ++++++++++++++ src/special/pvdbcrAddRecordRegister.cpp | 64 ++++++++ src/special/pvdbcrAddRecordRegister.dbd | 1 + src/special/pvdbcrProcessRecord.cpp | 166 ++++++++++++++++++++ src/special/pvdbcrProcessRecordRegister.cpp | 69 ++++++++ src/special/pvdbcrProcessRecordRegister.dbd | 1 + src/special/pvdbcrRemoveRecord.cpp | 92 +++++++++++ src/special/pvdbcrRemoveRecordRegister.cpp | 64 ++++++++ src/special/pvdbcrRemoveRecordRegister.dbd | 1 + src/special/pvdbcrScalarArrayRegister.cpp | 85 ++++++++++ src/special/pvdbcrScalarArrayRegister.dbd | 1 + src/special/pvdbcrScalarRegister.cpp | 85 ++++++++++ src/special/pvdbcrScalarRegister.dbd | 1 + src/special/pvdbcrTraceRecord.cpp | 95 +++++++++++ src/special/pvdbcrTraceRecordRegister.cpp | 65 ++++++++ src/special/pvdbcrTraceRecordRegister.dbd | 1 + src/special/removeRecordRegister.cpp | 1 + src/special/traceRecordRegister.cpp | 1 + 27 files changed, 1227 insertions(+) create mode 100644 src/pv/pvdbcrAddRecord.h create mode 100644 src/pv/pvdbcrProcessRecord.h create mode 100644 src/pv/pvdbcrRemoveRecord.h create mode 100644 src/pv/pvdbcrTraceRecord.h create mode 100644 src/special/pvdbcrAddRecord.cpp create mode 100644 src/special/pvdbcrAddRecordRegister.cpp create mode 100644 src/special/pvdbcrAddRecordRegister.dbd create mode 100644 src/special/pvdbcrProcessRecord.cpp create mode 100644 src/special/pvdbcrProcessRecordRegister.cpp create mode 100644 src/special/pvdbcrProcessRecordRegister.dbd create mode 100644 src/special/pvdbcrRemoveRecord.cpp create mode 100644 src/special/pvdbcrRemoveRecordRegister.cpp create mode 100644 src/special/pvdbcrRemoveRecordRegister.dbd create mode 100644 src/special/pvdbcrScalarArrayRegister.cpp create mode 100644 src/special/pvdbcrScalarArrayRegister.dbd create mode 100644 src/special/pvdbcrScalarRegister.cpp create mode 100644 src/special/pvdbcrScalarRegister.dbd create mode 100644 src/special/pvdbcrTraceRecord.cpp create mode 100644 src/special/pvdbcrTraceRecordRegister.cpp create mode 100644 src/special/pvdbcrTraceRecordRegister.dbd diff --git a/src/Makefile b/src/Makefile index 0e6db8c..a6def5b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,6 +28,11 @@ INC += pv/removeRecord.h INC += pv/addRecord.h INC += pv/processRecord.h +INC += pv/pvdbcrTraceRecord.h +INC += pv/pvdbcrRemoveRecord.h +INC += pv/pvdbcrAddRecord.h +INC += pv/pvdbcrProcessRecord.h + INC += pv/pvSupport.h INC += pv/controlSupport.h INC += pv/scalarAlarmSupport.h @@ -39,6 +44,7 @@ include $(PVDATABASE_SRC)/pvAccess/Makefile include $(PVDATABASE_SRC)/special/Makefile include $(PVDATABASE_SRC)/support/Makefile +pvDatabase_LIBS += nt pvDatabase_LIBS += $(EPICS_BASE_PVA_CORE_LIBS) pvDatabase_LIBS += $(EPICS_BASE_IOC_LIBS) diff --git a/src/pv/pvDatabase.h b/src/pv/pvDatabase.h index f21799d..a072466 100644 --- a/src/pv/pvDatabase.h +++ b/src/pv/pvDatabase.h @@ -248,6 +248,16 @@ public: * @return The name. */ std::string getAsGroup() const {return asGroup;} + /** + * @brief set access security level. + * @param level The level + */ + void setAsLevel(int level) {asLevel=level;} + /** + * @brief set access security group + * @param group The group name + */ + void setAsGroup(const std::string& group) {asGroup = group;} protected: /** * @brief Constructor diff --git a/src/pv/pvdbcrAddRecord.h b/src/pv/pvdbcrAddRecord.h new file mode 100644 index 0000000..8e7cbd7 --- /dev/null +++ b/src/pv/pvdbcrAddRecord.h @@ -0,0 +1,63 @@ +/* PvdbcrAddRecord.h */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ +#ifndef PVDBCRADDRECORD_H +#define PVDBCRADDRECORD_H + +#include + +#include + +namespace epics { namespace pvDatabase { + + +class PvdbcrAddRecord; +typedef std::tr1::shared_ptr PvdbcrAddRecordPtr; + +/** + * @brief Add another record in the same database. + * + * A record to add another record + * It is meant to be used via a channelPutGet request. + * The argument has one field: recordName. + * The result has a field named status. + */ +class epicsShareClass PvdbcrAddRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(PvdbcrAddRecord); + /** + * Factory methods to create PvdbcrAddRecord. + * @param recordName The name for the PvdbcrAddRecord. + * @return A shared pointer to PvdbcrAddRecord. + */ + static PvdbcrAddRecordPtr create( + std::string const & recordName); + /** + * standard init method required by PVRecord + * @return true unless record name already exists. + */ + virtual bool init(); + /** + * @brief Add the record specified by recordName. + */ + virtual void process(); +private: + PvdbcrAddRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +}; + +}} + +#endif /* PVDBCRADDRECORD_H */ diff --git a/src/pv/pvdbcrProcessRecord.h b/src/pv/pvdbcrProcessRecord.h new file mode 100644 index 0000000..c87ee6a --- /dev/null +++ b/src/pv/pvdbcrProcessRecord.h @@ -0,0 +1,89 @@ +/* PvdbcrProcessRecord.h */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ +#ifndef PVDBCRPROCESSRECORD_H +#define PVDBCRPROCESSRECORD_H + +#include +#include +#include +#include + +#include + +namespace epics { namespace pvDatabase { + +typedef std::tr1::shared_ptr EpicsThreadPtr; + +class PvdbcrProcessRecord; +typedef std::tr1::shared_ptr PvdbcrProcessRecordPtr; + +/** + * @brief Process another record in the same database. + * + * A record to process another record + * It is meant to be used via a channelPutGet request. + * The argument has one field: recordName. + * The result has a field named status. + */ +class epicsShareClass PvdbcrProcessRecord : + public PVRecord, + public epicsThreadRunable +{ +public: + POINTER_DEFINITIONS(PvdbcrProcessRecord); + /** + * Factory methods to create ProcessRecord. + * @param recordName The name for the ProcessRecord. + * @param delay Delay time to wait between process requests. + * @return A shared pointer to ProcessRecord. + */ + static PvdbcrProcessRecordPtr create( + std::string const & recordName,double delay); + /** + * standard init method required by PVRecord + * @return true unless record name already exists. + */ + virtual bool init(); + /** + * @brief Process the record specified by recordName. + */ + virtual void process(); + /** + * @brief The run method for the thread. + */ + virtual void run(); + /** + * @brief Start the thread + */ + void startThread(); + /** + * @brief Stop the thread + */ + void stop(); +private: + PvdbcrProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay); + double delay; + EpicsThreadPtr thread; + epics::pvData::Event runStop; + epics::pvData::Event runReturn; + PVDatabasePtr pvDatabase; + PVRecordMap pvRecordMap; + epics::pvData::PVStringPtr pvCommand; + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; + epics::pvData::Mutex mutex; +}; + +}} + +#endif /* PVDBCRPROCESSRECORD_H */ diff --git a/src/pv/pvdbcrRemoveRecord.h b/src/pv/pvdbcrRemoveRecord.h new file mode 100644 index 0000000..166edeb --- /dev/null +++ b/src/pv/pvdbcrRemoveRecord.h @@ -0,0 +1,63 @@ +/* PvdbcrRemoveRecord.h */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ +#ifndef PVDBCRREMOVERECORD_H +#define PVDBCRREMOVERECORD_H + +#include + +#include + +namespace epics { namespace pvDatabase { + + +class PvdbcrRemoveRecord; +typedef std::tr1::shared_ptr PvdbcrRemoveRecordPtr; + +/** + * @brief Remove another record in the same database. + * + * A record to remove another record + * It is meant to be used via a channelPutGet request. + * The argument has one field: recordName. + * The result has a field named status. + */ +class epicsShareClass PvdbcrRemoveRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(PvdbcrRemoveRecord); + /** + * Factory methods to create PvdbcrRemoveRecord. + * @param recordName The name for the PvdbcrRemoveRecord. + * @return A shared pointer to PvdbcrRemoveRecord.. + */ + static PvdbcrRemoveRecordPtr create( + std::string const & recordName); + /** + * standard init method required by PVRecord + * @return true unless record name already exists. + */ + virtual bool init(); + /** + * @brief Remove the record specified by recordName. + */ + virtual void process(); +private: + PvdbcrRemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +}; + +}} + +#endif /* PVDBCRREMOVERECORD_H */ diff --git a/src/pv/pvdbcrTraceRecord.h b/src/pv/pvdbcrTraceRecord.h new file mode 100644 index 0000000..38eccdd --- /dev/null +++ b/src/pv/pvdbcrTraceRecord.h @@ -0,0 +1,66 @@ +/* PvdbcrTraceRecord.h */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ +#ifndef PVDBCRTRACERECORD_H +#define PVDBCRTRACERECORD_H + +#include + +#include + + +namespace epics { namespace pvDatabase { + + +class PvdbcrTraceRecord; +typedef std::tr1::shared_ptr PvdbcrTraceRecordPtr; + +/** + * @brief Trace activity of PVRecord. + * + * A record to set the trace value for another record + * It is meant to be used via a channelPutGet request. + * The argument has two fields: recordName and level. + * The result has a field named status. + */ +class epicsShareClass PvdbcrTraceRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(PvdbcrTraceRecord); + /** + * @brief Factory method to create PvdbcrTraceRecord. + * + * @param recordName The name for the PvdbcrTraceRecord. + * @return A shared pointer to PvdbcrTraceRecord. + */ + static PvdbcrTraceRecordPtr create( + std::string const & recordName); + /** + * standard init method required by PVRecord + * @return true unless record name already exists. + */ + virtual bool init(); + /** + * @brief Set the trace level for record specified by recordName. + */ + virtual void process(); +private: + PvdbcrTraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVIntPtr pvLevel; + epics::pvData::PVStringPtr pvResult; +}; + +}} + +#endif /* PVDBCRTRACERECORD_H */ diff --git a/src/special/Makefile b/src/special/Makefile index e928d8f..b8b419d 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,6 +2,25 @@ SRC_DIRS += $(PVDATABASE_SRC)/special +LIBSRCS += pvdbcrTraceRecord.cpp +LIBSRCS += pvdbcrRemoveRecord.cpp +LIBSRCS += pvdbcrAddRecord.cpp +LIBSRCS += pvdbcrProcessRecord.cpp + +DBD += pvdbcrTraceRecordRegister.dbd +DBD += pvdbcrRemoveRecordRegister.dbd +DBD += pvdbcrAddRecordRegister.dbd +DBD += pvdbcrProcessRecordRegister.dbd +DBD += pvdbcrScalarRegister.dbd +DBD += pvdbcrScalarArrayRegister.dbd + +LIBSRCS += pvdbcrTraceRecordRegister.cpp +LIBSRCS += pvdbcrRemoveRecordRegister.cpp +LIBSRCS += pvdbcrAddRecordRegister.cpp +LIBSRCS += pvdbcrProcessRecordRegister.cpp +LIBSRCS += pvdbcrScalarRegister.cpp +LIBSRCS += pvdbcrScalarArrayRegister.cpp + LIBSRCS += traceRecord.cpp LIBSRCS += removeRecord.cpp LIBSRCS += addRecord.cpp diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 32e581b..4dee555 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -39,6 +39,7 @@ static const iocshFuncDef addRecordFuncDef = {"addRecordCreate", 1,testArgs}; static void addRecordCallFunc(const iocshArgBuf *args) { + cerr << "DEPRECATED use pvdbcrAddRecord instead\n"; char *recordName = args[0].sval; if(!recordName) { throw std::runtime_error("addRecordCreate invalid number of arguments"); diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index 5fb38ea..985f476 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -42,6 +42,7 @@ static const iocshFuncDef processRecordFuncDef = {"processRecordCreate", 2,testA static void processRecordCallFunc(const iocshArgBuf *args) { + cerr << "DEPRECATED use pvdbcrProcessRecord instead\n"; char *recordName = args[0].sval; if(!recordName) { throw std::runtime_error("processRecordCreate invalid number of arguments"); diff --git a/src/special/pvdbcrAddRecord.cpp b/src/special/pvdbcrAddRecord.cpp new file mode 100644 index 0000000..35c9073 --- /dev/null +++ b/src/special/pvdbcrAddRecord.cpp @@ -0,0 +1,116 @@ +/* pvdbcrAddRecord.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrAddRecord.h" + +using std::tr1::static_pointer_cast; +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace std; + +namespace epics { namespace pvDatabase { +PvdbcrAddRecordPtr PvdbcrAddRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + addNestedUnion("union") -> + endNested()-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrAddRecordPtr pvRecord( + new PvdbcrAddRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrAddRecord::PvdbcrAddRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool PvdbcrAddRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrAddRecord::process() +{ + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(pvRecord) { + pvResult->put(name + " already exists"); + return; + } + PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); + if(!pvUnion) { + pvResult->put(name + " argument.union is NULL"); + return; + } + PVFieldPtr pvField(pvUnion->get()); + if(!pvField) { + pvResult->put(name + " union has no value"); + return; + } + if(pvField->getField()->getType()!=epics::pvData::structure) { + pvResult->put(name + " union most be a structure"); + return; + } + StructureConstPtr st = static_pointer_cast(pvField->getField()); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); + PVRecordPtr pvRec = PVRecord::create(name,pvStructure); + bool result = PVDatabase::getMaster()->addRecord(pvRec); + if(result) { + pvResult->put("success"); + } else { + pvResult->put("failure"); + } +} + + +}} diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp new file mode 100644 index 0000000..ee79897 --- /dev/null +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -0,0 +1,64 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrAddRecord.h" + +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1}; + +static const iocshFuncDef pvdbcrAddRecordFuncDef = {"pvdbcrAddRecord", 2,testArgs}; + +static void pvdbcrAddRecordCallFunc(const iocshArgBuf *args) +{ + char *recordName = args[0].sval; + if(!recordName) { + throw std::runtime_error("pvdbcrAddRecord invalid number of arguments"); + } + int asLevel = args[1].ival; + PvdbcrAddRecordPtr record = PvdbcrAddRecord::create(recordName); + record->setAsLevel(asLevel); + bool result = PVDatabase::getMaster()->addRecord(record); + if(!result) cout << "recordname" << " not added" << endl; +} + +static void pvdbcrAddRecordRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrAddRecordFuncDef, pvdbcrAddRecordCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrAddRecordRegister); +} diff --git a/src/special/pvdbcrAddRecordRegister.dbd b/src/special/pvdbcrAddRecordRegister.dbd new file mode 100644 index 0000000..65f7c9b --- /dev/null +++ b/src/special/pvdbcrAddRecordRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrAddRecordRegister") diff --git a/src/special/pvdbcrProcessRecord.cpp b/src/special/pvdbcrProcessRecord.cpp new file mode 100644 index 0000000..7e6f78b --- /dev/null +++ b/src/special/pvdbcrProcessRecord.cpp @@ -0,0 +1,166 @@ +/* pvdbcrProcessRecord.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrProcessRecord.h" + +using std::tr1::static_pointer_cast; +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace std; + +namespace epics { namespace pvDatabase { + +PvdbcrProcessRecordPtr PvdbcrProcessRecord::create( + std::string const & recordName,double delay) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("command",pvString)-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrProcessRecordPtr pvRecord( + new PvdbcrProcessRecord(recordName,pvStructure,delay)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +void PvdbcrProcessRecord::startThread() +{ + thread = EpicsThreadPtr(new epicsThread( + *this, + "processRecord", + epicsThreadGetStackSize(epicsThreadStackSmall), + epicsThreadPriorityLow)); + thread->start(); +} + +void PvdbcrProcessRecord::stop() +{ + runStop.signal(); + runReturn.wait(); +} + + +PvdbcrProcessRecord::PvdbcrProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay) +: PVRecord(recordName,pvStructure), + delay(delay), + pvDatabase(PVDatabase::getMaster()) +{ +} + +bool PvdbcrProcessRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvCommand = pvStructure->getSubField("argument.command"); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + startThread(); + return true; +} + +void PvdbcrProcessRecord::process() +{ + string recordName = pvRecordName->get(); + string command = pvCommand->get(); + if(command.compare("add")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter!=pvRecordMap.end()) { + pvResult->put(recordName + " already present"); + return; + } + PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); + if(!pvRecord) { + pvResult->put(recordName + " not in pvDatabase"); + return; + } + pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); + pvResult->put("success"); + return; + } else if(command.compare("remove")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter==pvRecordMap.end()) { + pvResult->put(recordName + " not found"); + return; + } + pvRecordMap.erase(iter); + pvResult->put("success"); + return; + } else { + pvResult->put(command + " not a valid command: only add and remove are valid"); + return; + } +} + +void PvdbcrProcessRecord::run() +{ + while(true) { + if(runStop.tryWait()) { + runReturn.signal(); + return; + } + if(delay>0.0) epicsThreadSleep(delay); + epicsGuard guard(mutex); + PVRecordMap::iterator iter; + for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { + PVRecordPtr pvRecord = (*iter).second; + pvRecord->lock(); + pvRecord->beginGroupPut(); + try { + pvRecord->process(); + } catch (std::exception& ex) { + std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; + } catch (...) { + std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; + } + pvRecord->endGroupPut(); + pvRecord->unlock(); + } + } +} + + +}} diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp new file mode 100644 index 0000000..bc0228b --- /dev/null +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -0,0 +1,69 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrProcessRecord.h" + + +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "delay", iocshArgDouble }; +static const iocshArg testArg2 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; + +static const iocshFuncDef pvdbcrProcessRecordFuncDef = {"pvdbcrProcessRecord", 3,testArgs}; + +static void pvdbcrProcessRecordCallFunc(const iocshArgBuf *args) +{ + char *recordName = args[0].sval; + if(!recordName) { + throw std::runtime_error("pvdbcrProcessRecordCreate invalid number of arguments"); + } + double delay = args[1].dval; + int asLevel = args[2].ival; + if(delay<0.0) delay = 1.0; + PvdbcrProcessRecordPtr record = PvdbcrProcessRecord::create(recordName,delay); + record->setAsLevel(asLevel); + bool result = PVDatabase::getMaster()->addRecord(record); + if(!result) cout << "recordname" << " not added" << endl; +} + +static void pvdbcrProcessRecordRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrProcessRecordFuncDef, pvdbcrProcessRecordCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrProcessRecordRegister); +} diff --git a/src/special/pvdbcrProcessRecordRegister.dbd b/src/special/pvdbcrProcessRecordRegister.dbd new file mode 100644 index 0000000..8948909 --- /dev/null +++ b/src/special/pvdbcrProcessRecordRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrProcessRecordRegister") diff --git a/src/special/pvdbcrRemoveRecord.cpp b/src/special/pvdbcrRemoveRecord.cpp new file mode 100644 index 0000000..726a537 --- /dev/null +++ b/src/special/pvdbcrRemoveRecord.cpp @@ -0,0 +1,92 @@ +/* pvdbcrRemoveRecord.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrRemoveRecord.h" + +using std::tr1::static_pointer_cast; +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace std; + +namespace epics { namespace pvDatabase { + +PvdbcrRemoveRecordPtr PvdbcrRemoveRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrRemoveRecordPtr pvRecord( + new PvdbcrRemoveRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrRemoveRecord::PvdbcrRemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool PvdbcrRemoveRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrRemoveRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->remove(); + pvResult->put("success"); +} + + +}} diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp new file mode 100644 index 0000000..fbbde3e --- /dev/null +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -0,0 +1,64 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrRemoveRecord.h" + +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1}; + +static const iocshFuncDef pvdbcrRemoveRecordFuncDef = {"pvdbcrRemoveRecord", 2,testArgs}; + +static void pvdbcrRemoveRecordCallFunc(const iocshArgBuf *args) +{ + char *recordName = args[0].sval; + if(!recordName) { + throw std::runtime_error("pvdbcrRemoveRecordCreate invalid number of arguments"); + } + int asLevel = args[1].ival; + PvdbcrRemoveRecordPtr record = PvdbcrRemoveRecord::create(recordName); + record->setAsLevel(asLevel); + bool result = PVDatabase::getMaster()->addRecord(record); + if(!result) cout << "recordname" << " not added" << endl; +} + +static void pvdbcrRemoveRecordRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrRemoveRecordFuncDef, pvdbcrRemoveRecordCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrRemoveRecordRegister); +} diff --git a/src/special/pvdbcrRemoveRecordRegister.dbd b/src/special/pvdbcrRemoveRecordRegister.dbd new file mode 100644 index 0000000..99d21c5 --- /dev/null +++ b/src/special/pvdbcrRemoveRecordRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrRemoveRecordRegister") diff --git a/src/special/pvdbcrScalarArrayRegister.cpp b/src/special/pvdbcrScalarArrayRegister.cpp new file mode 100644 index 0000000..7b564a8 --- /dev/null +++ b/src/special/pvdbcrScalarArrayRegister.cpp @@ -0,0 +1,85 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" + +using namespace epics::pvData; +using namespace epics::nt; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "scalarType", iocshArgString }; +static const iocshArg testArg2 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; + +static const iocshFuncDef pvdbcrScalarArrayFuncDef = {"pvdbcrScalarArray", 3,testArgs}; + +static void pvdbcrScalarArrayCallFunc(const iocshArgBuf *args) +{ + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrScalarArrayCreate recordName not specified"); + } + string recordName = string(sval); + sval = args[1].sval; + if(!sval) { + throw std::runtime_error("pvdbcrScalarArrayCreate scalarType not specified"); + } + string scalarType = string(sval); + int asLevel = args[2].ival; + try { + ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); + NTScalarArrayBuilderPtr ntScalarArrayBuilder = NTScalarArray::createBuilder(); + PVStructurePtr pvStructure = ntScalarArrayBuilder-> + value(st)-> + addAlarm()-> + addTimeStamp()-> + createPVStructure(); + PVRecordPtr record = PVRecord::create(recordName,pvStructure); + record->setAsLevel(asLevel); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; + } catch(std::exception& ex) { + cerr << "failure " << ex.what() << "/n"; + } +} + +static void pvdbcrScalarArrayRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrScalarArrayFuncDef, pvdbcrScalarArrayCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrScalarArrayRegister); +} diff --git a/src/special/pvdbcrScalarArrayRegister.dbd b/src/special/pvdbcrScalarArrayRegister.dbd new file mode 100644 index 0000000..db27b53 --- /dev/null +++ b/src/special/pvdbcrScalarArrayRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrScalarArrayRegister") diff --git a/src/special/pvdbcrScalarRegister.cpp b/src/special/pvdbcrScalarRegister.cpp new file mode 100644 index 0000000..e44a777 --- /dev/null +++ b/src/special/pvdbcrScalarRegister.cpp @@ -0,0 +1,85 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" + +using namespace epics::pvData; +using namespace epics::nt; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "scalarType", iocshArgString }; +static const iocshArg testArg2 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; + +static const iocshFuncDef pvdbcrScalarFuncDef = {"pvdbcrScalar", 3,testArgs}; + +static void pvdbcrScalarCallFunc(const iocshArgBuf *args) +{ + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrScalarCreate recordName not specified"); + } + string recordName = string(sval); + sval = args[1].sval; + if(!sval) { + throw std::runtime_error("pvdbcrScalarCreate scalarType not specified"); + } + string scalarType = string(sval); + int asLevel = args[2].ival; + try { + ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); + NTScalarBuilderPtr ntScalarBuilder = NTScalar::createBuilder(); + PVStructurePtr pvStructure = ntScalarBuilder-> + value(st)-> + addAlarm()-> + addTimeStamp()-> + createPVStructure(); + PVRecordPtr record = PVRecord::create(recordName,pvStructure); + record->setAsLevel(asLevel); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; + } catch(std::exception& ex) { + cerr << "failure " << ex.what() << "/n"; + } +} + +static void pvdbcrScalarRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrScalarFuncDef, pvdbcrScalarCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrScalarRegister); +} diff --git a/src/special/pvdbcrScalarRegister.dbd b/src/special/pvdbcrScalarRegister.dbd new file mode 100644 index 0000000..1202c71 --- /dev/null +++ b/src/special/pvdbcrScalarRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrScalarRegister") diff --git a/src/special/pvdbcrTraceRecord.cpp b/src/special/pvdbcrTraceRecord.cpp new file mode 100644 index 0000000..e0a481a --- /dev/null +++ b/src/special/pvdbcrTraceRecord.cpp @@ -0,0 +1,95 @@ +/* pvdbcrTraceRecord.cpp */ +/** + * Copyright - See the COPYRIGHT that is included with this distribution. + * EPICS pvData is distributed subject to a Software License Agreement found + * in file LICENSE that is included with this distribution. + */ +/** + * @author mrk + * @date 2021.03.12 + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" +#include "pv/pvdbcrTraceRecord.h" + +using std::tr1::static_pointer_cast; +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace std; + +namespace epics { namespace pvDatabase { + +PvdbcrTraceRecordPtr PvdbcrTraceRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + add("level",pvInt)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrTraceRecordPtr pvRecord( + new PvdbcrTraceRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrTraceRecord::PvdbcrTraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + + +bool PvdbcrTraceRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvLevel = pvStructure->getSubField("argument.level"); + if(!pvLevel) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrTraceRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->setTraceLevel(pvLevel->get()); + pvResult->put("success"); +} + + +}} diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp new file mode 100644 index 0000000..a9b5f0c --- /dev/null +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -0,0 +1,65 @@ +/* + * Copyright information and license terms for this software can be + * found in the file LICENSE that is included with the distribution + */ + +/** + * @author mrk + * @date 2021.03.12 + */ + + +/* Author: Marty Kraimer */ + +#include +#include +#include +#include +#include +#include +#include +#include + +// The following must be the last include for code pvDatabase uses +#include +#define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" +#include "pv/pvdbcrTraceRecord.h" + +using namespace epics::pvData; +using namespace epics::pvAccess; +using namespace epics::pvDatabase; +using namespace std; + +static const iocshArg testArg0 = { "recordName", iocshArgString }; +static const iocshArg testArg1 = { "asLevel", iocshArgInt }; +static const iocshArg *testArgs[] = {&testArg0,&testArg1}; + +static const iocshFuncDef pvdbcrTraceRecordFuncDef = {"pvdbcrTraceRecord", 2,testArgs}; + +static void pvdbcrTraceRecordCallFunc(const iocshArgBuf *args) +{ + char *recordName = args[0].sval; + if(!recordName) { + throw std::runtime_error("traceRecordCreate invalid number of arguments"); + } + int asLevel = args[1].ival; + PvdbcrTraceRecordPtr record = PvdbcrTraceRecord::create(recordName); + record->setAsLevel(asLevel); + bool result = PVDatabase::getMaster()->addRecord(record); + if(!result) cout << "recordname" << " not added" << endl; +} + +static void pvdbcrTraceRecordRegister(void) +{ + static int firstTime = 1; + if (firstTime) { + firstTime = 0; + iocshRegister(&pvdbcrTraceRecordFuncDef, pvdbcrTraceRecordCallFunc); + } +} + +extern "C" { + epicsExportRegistrar(pvdbcrTraceRecordRegister); +} diff --git a/src/special/pvdbcrTraceRecordRegister.dbd b/src/special/pvdbcrTraceRecordRegister.dbd new file mode 100644 index 0000000..c525320 --- /dev/null +++ b/src/special/pvdbcrTraceRecordRegister.dbd @@ -0,0 +1 @@ +registrar("pvdbcrTraceRecordRegister") diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index c55f34a..4976c3e 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -39,6 +39,7 @@ static const iocshFuncDef removeRecordFuncDef = {"removeRecordCreate", 1,testArg static void removeRecordCallFunc(const iocshArgBuf *args) { + cerr << "DEPRECATED use pvdbcrRemoveRecord instead\n"; char *recordName = args[0].sval; if(!recordName) { throw std::runtime_error("removeRecordCreate invalid number of arguments"); diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp index 57d20f4..3c60400 100644 --- a/src/special/traceRecordRegister.cpp +++ b/src/special/traceRecordRegister.cpp @@ -40,6 +40,7 @@ static const iocshFuncDef traceRecordFuncDef = {"traceRecordCreate", 1,testArgs} static void traceRecordCallFunc(const iocshArgBuf *args) { + cerr << "DEPRECATED use pvdbcrTraceRecord instead\n"; char *recordName = args[0].sval; if(!recordName) { throw std::runtime_error("traceRecordCreate invalid number of arguments"); From 333cd44da042020bf8bff953ddc36c47eaa80448 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Sat, 20 Mar 2021 10:48:08 -0400 Subject: [PATCH 03/20] The following were made to all special pvdbcr modules 1) Much cleaner implementation. 2) pvdbSpecialRegister.dbd is new --- src/Makefile | 5 - src/pv/pvdbcrAddRecord.h | 63 ------ src/pv/pvdbcrProcessRecord.h | 89 --------- src/pv/pvdbcrRemoveRecord.h | 63 ------ src/pv/pvdbcrTraceRecord.h | 66 ------ src/special/Makefile | 5 +- src/special/pvdbSpecialRegister.dbd | 6 + src/special/pvdbcrAddRecord.cpp | 116 ----------- src/special/pvdbcrAddRecordRegister.cpp | 145 ++++++++++++-- src/special/pvdbcrProcessRecord.cpp | 166 ---------------- src/special/pvdbcrProcessRecordRegister.cpp | 210 +++++++++++++++++--- src/special/pvdbcrRemoveRecord.cpp | 92 --------- src/special/pvdbcrRemoveRecordRegister.cpp | 120 +++++++++-- src/special/pvdbcrScalarArrayRegister.cpp | 64 +++--- src/special/pvdbcrScalarRegister.cpp | 71 +++---- src/special/pvdbcrTraceRecord.cpp | 95 --------- src/special/pvdbcrTraceRecordRegister.cpp | 129 +++++++++--- 17 files changed, 577 insertions(+), 928 deletions(-) delete mode 100644 src/pv/pvdbcrAddRecord.h delete mode 100644 src/pv/pvdbcrProcessRecord.h delete mode 100644 src/pv/pvdbcrRemoveRecord.h delete mode 100644 src/pv/pvdbcrTraceRecord.h create mode 100644 src/special/pvdbSpecialRegister.dbd delete mode 100644 src/special/pvdbcrAddRecord.cpp delete mode 100644 src/special/pvdbcrProcessRecord.cpp delete mode 100644 src/special/pvdbcrRemoveRecord.cpp delete mode 100644 src/special/pvdbcrTraceRecord.cpp diff --git a/src/Makefile b/src/Makefile index a6def5b..d40399f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,11 +28,6 @@ INC += pv/removeRecord.h INC += pv/addRecord.h INC += pv/processRecord.h -INC += pv/pvdbcrTraceRecord.h -INC += pv/pvdbcrRemoveRecord.h -INC += pv/pvdbcrAddRecord.h -INC += pv/pvdbcrProcessRecord.h - INC += pv/pvSupport.h INC += pv/controlSupport.h INC += pv/scalarAlarmSupport.h diff --git a/src/pv/pvdbcrAddRecord.h b/src/pv/pvdbcrAddRecord.h deleted file mode 100644 index 8e7cbd7..0000000 --- a/src/pv/pvdbcrAddRecord.h +++ /dev/null @@ -1,63 +0,0 @@ -/* PvdbcrAddRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ -#ifndef PVDBCRADDRECORD_H -#define PVDBCRADDRECORD_H - -#include - -#include - -namespace epics { namespace pvDatabase { - - -class PvdbcrAddRecord; -typedef std::tr1::shared_ptr PvdbcrAddRecordPtr; - -/** - * @brief Add another record in the same database. - * - * A record to add another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass PvdbcrAddRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(PvdbcrAddRecord); - /** - * Factory methods to create PvdbcrAddRecord. - * @param recordName The name for the PvdbcrAddRecord. - * @return A shared pointer to PvdbcrAddRecord. - */ - static PvdbcrAddRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Add the record specified by recordName. - */ - virtual void process(); -private: - PvdbcrAddRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* PVDBCRADDRECORD_H */ diff --git a/src/pv/pvdbcrProcessRecord.h b/src/pv/pvdbcrProcessRecord.h deleted file mode 100644 index c87ee6a..0000000 --- a/src/pv/pvdbcrProcessRecord.h +++ /dev/null @@ -1,89 +0,0 @@ -/* PvdbcrProcessRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ -#ifndef PVDBCRPROCESSRECORD_H -#define PVDBCRPROCESSRECORD_H - -#include -#include -#include -#include - -#include - -namespace epics { namespace pvDatabase { - -typedef std::tr1::shared_ptr EpicsThreadPtr; - -class PvdbcrProcessRecord; -typedef std::tr1::shared_ptr PvdbcrProcessRecordPtr; - -/** - * @brief Process another record in the same database. - * - * A record to process another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass PvdbcrProcessRecord : - public PVRecord, - public epicsThreadRunable -{ -public: - POINTER_DEFINITIONS(PvdbcrProcessRecord); - /** - * Factory methods to create ProcessRecord. - * @param recordName The name for the ProcessRecord. - * @param delay Delay time to wait between process requests. - * @return A shared pointer to ProcessRecord. - */ - static PvdbcrProcessRecordPtr create( - std::string const & recordName,double delay); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Process the record specified by recordName. - */ - virtual void process(); - /** - * @brief The run method for the thread. - */ - virtual void run(); - /** - * @brief Start the thread - */ - void startThread(); - /** - * @brief Stop the thread - */ - void stop(); -private: - PvdbcrProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay); - double delay; - EpicsThreadPtr thread; - epics::pvData::Event runStop; - epics::pvData::Event runReturn; - PVDatabasePtr pvDatabase; - PVRecordMap pvRecordMap; - epics::pvData::PVStringPtr pvCommand; - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; - epics::pvData::Mutex mutex; -}; - -}} - -#endif /* PVDBCRPROCESSRECORD_H */ diff --git a/src/pv/pvdbcrRemoveRecord.h b/src/pv/pvdbcrRemoveRecord.h deleted file mode 100644 index 166edeb..0000000 --- a/src/pv/pvdbcrRemoveRecord.h +++ /dev/null @@ -1,63 +0,0 @@ -/* PvdbcrRemoveRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ -#ifndef PVDBCRREMOVERECORD_H -#define PVDBCRREMOVERECORD_H - -#include - -#include - -namespace epics { namespace pvDatabase { - - -class PvdbcrRemoveRecord; -typedef std::tr1::shared_ptr PvdbcrRemoveRecordPtr; - -/** - * @brief Remove another record in the same database. - * - * A record to remove another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass PvdbcrRemoveRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(PvdbcrRemoveRecord); - /** - * Factory methods to create PvdbcrRemoveRecord. - * @param recordName The name for the PvdbcrRemoveRecord. - * @return A shared pointer to PvdbcrRemoveRecord.. - */ - static PvdbcrRemoveRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Remove the record specified by recordName. - */ - virtual void process(); -private: - PvdbcrRemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* PVDBCRREMOVERECORD_H */ diff --git a/src/pv/pvdbcrTraceRecord.h b/src/pv/pvdbcrTraceRecord.h deleted file mode 100644 index 38eccdd..0000000 --- a/src/pv/pvdbcrTraceRecord.h +++ /dev/null @@ -1,66 +0,0 @@ -/* PvdbcrTraceRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ -#ifndef PVDBCRTRACERECORD_H -#define PVDBCRTRACERECORD_H - -#include - -#include - - -namespace epics { namespace pvDatabase { - - -class PvdbcrTraceRecord; -typedef std::tr1::shared_ptr PvdbcrTraceRecordPtr; - -/** - * @brief Trace activity of PVRecord. - * - * A record to set the trace value for another record - * It is meant to be used via a channelPutGet request. - * The argument has two fields: recordName and level. - * The result has a field named status. - */ -class epicsShareClass PvdbcrTraceRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(PvdbcrTraceRecord); - /** - * @brief Factory method to create PvdbcrTraceRecord. - * - * @param recordName The name for the PvdbcrTraceRecord. - * @return A shared pointer to PvdbcrTraceRecord. - */ - static PvdbcrTraceRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Set the trace level for record specified by recordName. - */ - virtual void process(); -private: - PvdbcrTraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVIntPtr pvLevel; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* PVDBCRTRACERECORD_H */ diff --git a/src/special/Makefile b/src/special/Makefile index b8b419d..15061da 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,10 +2,6 @@ SRC_DIRS += $(PVDATABASE_SRC)/special -LIBSRCS += pvdbcrTraceRecord.cpp -LIBSRCS += pvdbcrRemoveRecord.cpp -LIBSRCS += pvdbcrAddRecord.cpp -LIBSRCS += pvdbcrProcessRecord.cpp DBD += pvdbcrTraceRecordRegister.dbd DBD += pvdbcrRemoveRecordRegister.dbd @@ -13,6 +9,7 @@ DBD += pvdbcrAddRecordRegister.dbd DBD += pvdbcrProcessRecordRegister.dbd DBD += pvdbcrScalarRegister.dbd DBD += pvdbcrScalarArrayRegister.dbd +DBD += pvdbSpecialRegister.dbd LIBSRCS += pvdbcrTraceRecordRegister.cpp LIBSRCS += pvdbcrRemoveRecordRegister.cpp diff --git a/src/special/pvdbSpecialRegister.dbd b/src/special/pvdbSpecialRegister.dbd new file mode 100644 index 0000000..eb36e2e --- /dev/null +++ b/src/special/pvdbSpecialRegister.dbd @@ -0,0 +1,6 @@ +include "pvdbcrAddRecordRegister.dbd" +include "pvdbcrRemoveRecordRegister.dbd" +include "pvdbcrProcessRecordRegister.dbd" +include "pvdbcrTraceRecordRegister.dbd" +include "pvdbcrScalarRegister.dbd" +include "pvdbcrScalarArrayRegister.dbd" diff --git a/src/special/pvdbcrAddRecord.cpp b/src/special/pvdbcrAddRecord.cpp deleted file mode 100644 index 35c9073..0000000 --- a/src/special/pvdbcrAddRecord.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* pvdbcrAddRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrAddRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { -PvdbcrAddRecordPtr PvdbcrAddRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - addNestedUnion("union") -> - endNested()-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - PvdbcrAddRecordPtr pvRecord( - new PvdbcrAddRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -PvdbcrAddRecord::PvdbcrAddRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool PvdbcrAddRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void PvdbcrAddRecord::process() -{ - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(pvRecord) { - pvResult->put(name + " already exists"); - return; - } - PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); - if(!pvUnion) { - pvResult->put(name + " argument.union is NULL"); - return; - } - PVFieldPtr pvField(pvUnion->get()); - if(!pvField) { - pvResult->put(name + " union has no value"); - return; - } - if(pvField->getField()->getType()!=epics::pvData::structure) { - pvResult->put(name + " union most be a structure"); - return; - } - StructureConstPtr st = static_pointer_cast(pvField->getField()); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); - PVRecordPtr pvRec = PVRecord::create(name,pvStructure); - bool result = PVDatabase::getMaster()->addRecord(pvRec); - if(result) { - pvResult->put("success"); - } else { - pvResult->put("failure"); - } -} - - -}} diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index ee79897..ae18beb 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -7,47 +7,148 @@ * @author mrk * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ -#include #include -#include -#include -#include -#include +#include +#include +#include #include -#include +#include +#include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrAddRecord.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; +using namespace epics::pvaClient; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1}; +class PvdbcrAddRecord; +typedef std::tr1::shared_ptr PvdbcrAddRecordPtr; -static const iocshFuncDef pvdbcrAddRecordFuncDef = {"pvdbcrAddRecord", 2,testArgs}; + +class epicsShareClass PvdbcrAddRecord : + public PVRecord +{ +private: + PvdbcrAddRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +public: + POINTER_DEFINITIONS(PvdbcrAddRecord); + + static PvdbcrAddRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +}; + +PvdbcrAddRecordPtr PvdbcrAddRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + addNestedUnion("union") -> + endNested()-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrAddRecordPtr pvRecord( + new PvdbcrAddRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrAddRecord::PvdbcrAddRecord( + std::string const & recordName, + PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool PvdbcrAddRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrAddRecord::process() +{ + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(pvRecord) { + pvResult->put(name + " already exists"); + return; + } + PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); + if(!pvUnion) { + pvResult->put(name + " argument.union is NULL"); + return; + } + PVFieldPtr pvField(pvUnion->get()); + if(!pvField) { + pvResult->put(name + " union has no value"); + return; + } + if(pvField->getField()->getType()!=epics::pvData::structure) { + pvResult->put(name + " union most be a structure"); + return; + } + StructureConstPtr st = static_pointer_cast(pvField->getField()); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); + PVRecordPtr pvRec = PVRecord::create(name,pvStructure); + bool result = PVDatabase::getMaster()->addRecord(pvRec); + if(result) { + pvResult->put("success"); + } else { + pvResult->put("failure"); + } +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "asLevel", iocshArgInt }; +static const iocshArg arg2 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2}; + +static const iocshFuncDef pvdbcrAddRecordFuncDef = {"pvdbcrAddRecord", 3,args}; static void pvdbcrAddRecordCallFunc(const iocshArgBuf *args) { - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("pvdbcrAddRecord invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrAddRecord recordName not specified"); } + string recordName = string(sval); int asLevel = args[1].ival; + string asGroup("DEFAULT"); + sval = args[2].sval; + if(sval) { + asGroup = string(sval); + } PvdbcrAddRecordPtr record = PvdbcrAddRecord::create(recordName); record->setAsLevel(asLevel); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrAddRecordRegister(void) diff --git a/src/special/pvdbcrProcessRecord.cpp b/src/special/pvdbcrProcessRecord.cpp deleted file mode 100644 index 7e6f78b..0000000 --- a/src/special/pvdbcrProcessRecord.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* pvdbcrProcessRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrProcessRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -PvdbcrProcessRecordPtr PvdbcrProcessRecord::create( - std::string const & recordName,double delay) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("command",pvString)-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - PvdbcrProcessRecordPtr pvRecord( - new PvdbcrProcessRecord(recordName,pvStructure,delay)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -void PvdbcrProcessRecord::startThread() -{ - thread = EpicsThreadPtr(new epicsThread( - *this, - "processRecord", - epicsThreadGetStackSize(epicsThreadStackSmall), - epicsThreadPriorityLow)); - thread->start(); -} - -void PvdbcrProcessRecord::stop() -{ - runStop.signal(); - runReturn.wait(); -} - - -PvdbcrProcessRecord::PvdbcrProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay) -: PVRecord(recordName,pvStructure), - delay(delay), - pvDatabase(PVDatabase::getMaster()) -{ -} - -bool PvdbcrProcessRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvCommand = pvStructure->getSubField("argument.command"); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - startThread(); - return true; -} - -void PvdbcrProcessRecord::process() -{ - string recordName = pvRecordName->get(); - string command = pvCommand->get(); - if(command.compare("add")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter!=pvRecordMap.end()) { - pvResult->put(recordName + " already present"); - return; - } - PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); - if(!pvRecord) { - pvResult->put(recordName + " not in pvDatabase"); - return; - } - pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); - pvResult->put("success"); - return; - } else if(command.compare("remove")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter==pvRecordMap.end()) { - pvResult->put(recordName + " not found"); - return; - } - pvRecordMap.erase(iter); - pvResult->put("success"); - return; - } else { - pvResult->put(command + " not a valid command: only add and remove are valid"); - return; - } -} - -void PvdbcrProcessRecord::run() -{ - while(true) { - if(runStop.tryWait()) { - runReturn.signal(); - return; - } - if(delay>0.0) epicsThreadSleep(delay); - epicsGuard guard(mutex); - PVRecordMap::iterator iter; - for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { - PVRecordPtr pvRecord = (*iter).second; - pvRecord->lock(); - pvRecord->beginGroupPut(); - try { - pvRecord->process(); - } catch (std::exception& ex) { - std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; - } catch (...) { - std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; - } - pvRecord->endGroupPut(); - pvRecord->unlock(); - } - } -} - - -}} diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index bc0228b..f029fd8 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -7,52 +7,212 @@ * @author mrk * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ - #include -#include #include -#include -#include -#include +#include +#include +#include +#include #include -#include +#include +#include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrProcessRecord.h" - using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; +using namespace epics::pvaClient; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "delay", iocshArgDouble }; -static const iocshArg testArg2 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; +typedef std::tr1::shared_ptr EpicsThreadPtr; +class PvdbcrProcessRecord; +typedef std::tr1::shared_ptr PvdbcrProcessRecordPtr; -static const iocshFuncDef pvdbcrProcessRecordFuncDef = {"pvdbcrProcessRecord", 3,testArgs}; +class epicsShareClass PvdbcrProcessRecord : + public PVRecord, + public epicsThreadRunable +{ +public: + POINTER_DEFINITIONS(PvdbcrProcessRecord); + static PvdbcrProcessRecordPtr create( + std::string const & recordName,double delay); + virtual bool init(); + virtual void process(); + virtual void run(); + void startThread(); + void stop(); +private: + PvdbcrProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay); + double delay; + EpicsThreadPtr thread; + epics::pvData::Event runStop; + epics::pvData::Event runReturn; + PVDatabasePtr pvDatabase; + PVRecordMap pvRecordMap; + epics::pvData::PVStringPtr pvCommand; + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; + epics::pvData::Mutex mutex; +}; + +PvdbcrProcessRecordPtr PvdbcrProcessRecord::create( + std::string const & recordName,double delay) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("command",pvString)-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrProcessRecordPtr pvRecord( + new PvdbcrProcessRecord(recordName,pvStructure,delay)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +void PvdbcrProcessRecord::startThread() +{ + thread = EpicsThreadPtr(new epicsThread( + *this, + "processRecord", + epicsThreadGetStackSize(epicsThreadStackSmall), + epicsThreadPriorityLow)); + thread->start(); +} + +void PvdbcrProcessRecord::stop() +{ + runStop.signal(); + runReturn.wait(); +} + + +PvdbcrProcessRecord::PvdbcrProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay) +: PVRecord(recordName,pvStructure), + delay(delay), + pvDatabase(PVDatabase::getMaster()) +{ +} + +bool PvdbcrProcessRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvCommand = pvStructure->getSubField("argument.command"); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + startThread(); + return true; +} + +void PvdbcrProcessRecord::process() +{ + string recordName = pvRecordName->get(); + string command = pvCommand->get(); + if(command.compare("add")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter!=pvRecordMap.end()) { + pvResult->put(recordName + " already present"); + return; + } + PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); + if(!pvRecord) { + pvResult->put(recordName + " not in pvDatabase"); + return; + } + pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); + pvResult->put("success"); + return; + } else if(command.compare("remove")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter==pvRecordMap.end()) { + pvResult->put(recordName + " not found"); + return; + } + pvRecordMap.erase(iter); + pvResult->put("success"); + return; + } else { + pvResult->put(command + " not a valid command: only add and remove are valid"); + return; + } +} + +void PvdbcrProcessRecord::run() +{ + while(true) { + if(runStop.tryWait()) { + runReturn.signal(); + return; + } + if(delay>0.0) epicsThreadSleep(delay); + epicsGuard guard(mutex); + PVRecordMap::iterator iter; + for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { + PVRecordPtr pvRecord = (*iter).second; + pvRecord->lock(); + pvRecord->beginGroupPut(); + try { + pvRecord->process(); + } catch (std::exception& ex) { + std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; + } catch (...) { + std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; + } + pvRecord->endGroupPut(); + pvRecord->unlock(); + } + } +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "delay", iocshArgDouble }; +static const iocshArg arg2 = { "asLevel", iocshArgInt }; +static const iocshArg arg3 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2,&arg3}; + +static const iocshFuncDef pvdbcrProcessRecordFuncDef = {"pvdbcrProcessRecord", 4,args}; static void pvdbcrProcessRecordCallFunc(const iocshArgBuf *args) { - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("pvdbcrProcessRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrProcessRecord recordName not specified"); } + string recordName = string(sval); double delay = args[1].dval; - int asLevel = args[2].ival; if(delay<0.0) delay = 1.0; + int asLevel = args[2].ival; + string asGroup("DEFAULT"); + sval = args[3].sval; + if(sval) { + asGroup = string(sval); + } PvdbcrProcessRecordPtr record = PvdbcrProcessRecord::create(recordName,delay); record->setAsLevel(asLevel); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrProcessRecordRegister(void) diff --git a/src/special/pvdbcrRemoveRecord.cpp b/src/special/pvdbcrRemoveRecord.cpp deleted file mode 100644 index 726a537..0000000 --- a/src/special/pvdbcrRemoveRecord.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* pvdbcrRemoveRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrRemoveRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -PvdbcrRemoveRecordPtr PvdbcrRemoveRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - PvdbcrRemoveRecordPtr pvRecord( - new PvdbcrRemoveRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -PvdbcrRemoveRecord::PvdbcrRemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool PvdbcrRemoveRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void PvdbcrRemoveRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->remove(); - pvResult->put("success"); -} - - -}} diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp index fbbde3e..477cb51 100644 --- a/src/special/pvdbcrRemoveRecordRegister.cpp +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -7,47 +7,123 @@ * @author mrk * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ -#include #include -#include -#include -#include -#include +#include +#include +#include #include -#include +#include +#include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrRemoveRecord.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; +using namespace epics::pvaClient; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1}; +class PvdbcrRemoveRecord; +typedef std::tr1::shared_ptr PvdbcrRemoveRecordPtr; -static const iocshFuncDef pvdbcrRemoveRecordFuncDef = {"pvdbcrRemoveRecord", 2,testArgs}; + +class epicsShareClass PvdbcrRemoveRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(PvdbcrRemoveRecord); + static PvdbcrRemoveRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +private: + PvdbcrRemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +}; + +PvdbcrRemoveRecordPtr PvdbcrRemoveRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrRemoveRecordPtr pvRecord( + new PvdbcrRemoveRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrRemoveRecord::PvdbcrRemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool PvdbcrRemoveRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrRemoveRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->remove(); + pvResult->put("success"); +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "asLevel", iocshArgInt }; +static const iocshArg arg2 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2}; + +static const iocshFuncDef pvdbcrRemoveRecordFuncDef = {"pvdbcrRemoveRecord", 3,args}; static void pvdbcrRemoveRecordCallFunc(const iocshArgBuf *args) { - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("pvdbcrRemoveRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrRemoveRecord recordName not specified"); } + string recordName = string(sval); int asLevel = args[1].ival; + string asGroup("DEFAULT"); + sval = args[2].sval; + if(sval) { + asGroup = string(sval); + } PvdbcrRemoveRecordPtr record = PvdbcrRemoveRecord::create(recordName); record->setAsLevel(asLevel); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrRemoveRecordRegister(void) diff --git a/src/special/pvdbcrScalarArrayRegister.cpp b/src/special/pvdbcrScalarArrayRegister.cpp index 7b564a8..5e0a3da 100644 --- a/src/special/pvdbcrScalarArrayRegister.cpp +++ b/src/special/pvdbcrScalarArrayRegister.cpp @@ -10,35 +10,24 @@ /* Author: Marty Kraimer */ - -#include #include -#include -#include -#include -#include -#include -#include -#include - -// The following must be the last include for code pvDatabase uses +#include +#include +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" using namespace epics::pvData; -using namespace epics::nt; -using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "scalarType", iocshArgString }; -static const iocshArg testArg2 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "scalarType", iocshArgString }; +static const iocshArg arg2 = { "asLevel", iocshArgInt }; +static const iocshArg arg3 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2,&arg3}; -static const iocshFuncDef pvdbcrScalarArrayFuncDef = {"pvdbcrScalarArray", 3,testArgs}; +static const iocshFuncDef pvdbcrScalarArrayFuncDef = {"pvdbcrScalarArray", 4,args}; static void pvdbcrScalarArrayCallFunc(const iocshArgBuf *args) { @@ -53,22 +42,27 @@ static void pvdbcrScalarArrayCallFunc(const iocshArgBuf *args) } string scalarType = string(sval); int asLevel = args[2].ival; - try { - ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); - NTScalarArrayBuilderPtr ntScalarArrayBuilder = NTScalarArray::createBuilder(); - PVStructurePtr pvStructure = ntScalarArrayBuilder-> - value(st)-> - addAlarm()-> - addTimeStamp()-> - createPVStructure(); - PVRecordPtr record = PVRecord::create(recordName,pvStructure); - record->setAsLevel(asLevel); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; - } catch(std::exception& ex) { - cerr << "failure " << ex.what() << "/n"; + string asGroup("DEFAULT"); + sval = args[3].sval; + if(sval) { + asGroup = string(sval); } + ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); + FieldCreatePtr fieldCreate = getFieldCreate(); + StandardFieldPtr standardField = getStandardField(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr top = fieldCreate->createFieldBuilder()-> + addArray("value",st) -> + add("timeStamp",standardField->timeStamp()) -> + add("alarm",standardField->alarm()) -> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(top); + PVRecordPtr record = PVRecord::create(recordName,pvStructure); + record->setAsLevel(asLevel); + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrScalarArrayRegister(void) diff --git a/src/special/pvdbcrScalarRegister.cpp b/src/special/pvdbcrScalarRegister.cpp index e44a777..c6688cc 100644 --- a/src/special/pvdbcrScalarRegister.cpp +++ b/src/special/pvdbcrScalarRegister.cpp @@ -7,68 +7,59 @@ * @author mrk * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ - -#include #include -#include -#include -#include -#include -#include -#include -#include - -// The following must be the last include for code pvDatabase uses +#include +#include +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" using namespace epics::pvData; -using namespace epics::nt; -using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "scalarType", iocshArgString }; -static const iocshArg testArg2 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1,&testArg2}; +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "scalarType", iocshArgString }; +static const iocshArg arg2 = { "asLevel", iocshArgInt }; +static const iocshArg arg3 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2,&arg3}; -static const iocshFuncDef pvdbcrScalarFuncDef = {"pvdbcrScalar", 3,testArgs}; +static const iocshFuncDef pvdbcrScalarFuncDef = {"pvdbcrScalar", 4,args}; static void pvdbcrScalarCallFunc(const iocshArgBuf *args) { char *sval = args[0].sval; if(!sval) { - throw std::runtime_error("pvdbcrScalarCreate recordName not specified"); + throw std::runtime_error("pvdbcrScalarArrayCreate recordName not specified"); } string recordName = string(sval); sval = args[1].sval; if(!sval) { - throw std::runtime_error("pvdbcrScalarCreate scalarType not specified"); + throw std::runtime_error("pvdbcrScalarArrayCreate scalarType not specified"); } string scalarType = string(sval); int asLevel = args[2].ival; - try { - ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); - NTScalarBuilderPtr ntScalarBuilder = NTScalar::createBuilder(); - PVStructurePtr pvStructure = ntScalarBuilder-> - value(st)-> - addAlarm()-> - addTimeStamp()-> - createPVStructure(); - PVRecordPtr record = PVRecord::create(recordName,pvStructure); - record->setAsLevel(asLevel); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; - } catch(std::exception& ex) { - cerr << "failure " << ex.what() << "/n"; + string asGroup("DEFAULT"); + sval = args[3].sval; + if(sval) { + asGroup = string(sval); } + ScalarType st = epics::pvData::ScalarTypeFunc::getScalarType(scalarType); + FieldCreatePtr fieldCreate = getFieldCreate(); + StandardFieldPtr standardField = getStandardField(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr top = fieldCreate->createFieldBuilder()-> + add("value",st) -> + add("timeStamp",standardField->timeStamp()) -> + add("alarm",standardField->alarm()) -> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(top); + PVRecordPtr record = PVRecord::create(recordName,pvStructure); + record->setAsLevel(asLevel); + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrScalarRegister(void) diff --git a/src/special/pvdbcrTraceRecord.cpp b/src/special/pvdbcrTraceRecord.cpp deleted file mode 100644 index e0a481a..0000000 --- a/src/special/pvdbcrTraceRecord.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* pvdbcrTraceRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2021.03.12 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/pvdbcrTraceRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -PvdbcrTraceRecordPtr PvdbcrTraceRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - add("level",pvInt)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - PvdbcrTraceRecordPtr pvRecord( - new PvdbcrTraceRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -PvdbcrTraceRecord::PvdbcrTraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - - -bool PvdbcrTraceRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvLevel = pvStructure->getSubField("argument.level"); - if(!pvLevel) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void PvdbcrTraceRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->setTraceLevel(pvLevel->get()); - pvResult->put("success"); -} - - -}} diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index a9b5f0c..ac394e6 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -7,48 +7,127 @@ * @author mrk * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ - -#include -#include -#include -#include -#include -#include + #include +#include +#include +#include #include -#include +#include +#include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/pvdbcrTraceRecord.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; +using namespace epics::pvaClient; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "asLevel", iocshArgInt }; -static const iocshArg *testArgs[] = {&testArg0,&testArg1}; +class PvdbcrTraceRecord; +typedef std::tr1::shared_ptr PvdbcrTraceRecordPtr; -static const iocshFuncDef pvdbcrTraceRecordFuncDef = {"pvdbcrTraceRecord", 2,testArgs}; +class epicsShareClass PvdbcrTraceRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(PvdbcrTraceRecord); + static PvdbcrTraceRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +private: + PvdbcrTraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVIntPtr pvLevel; + epics::pvData::PVStringPtr pvResult; +}; + +PvdbcrTraceRecordPtr PvdbcrTraceRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + add("level",pvInt)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + PvdbcrTraceRecordPtr pvRecord( + new PvdbcrTraceRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +PvdbcrTraceRecord::PvdbcrTraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + + +bool PvdbcrTraceRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvLevel = pvStructure->getSubField("argument.level"); + if(!pvLevel) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void PvdbcrTraceRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->setTraceLevel(pvLevel->get()); + pvResult->put("success"); +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "asLevel", iocshArgInt }; +static const iocshArg arg2 = { "asGroup", iocshArgString }; +static const iocshArg *args[] = {&arg0,&arg1,&arg2}; + +static const iocshFuncDef pvdbcrTraceRecordFuncDef = {"pvdbcrTraceRecord", 3,args}; static void pvdbcrTraceRecordCallFunc(const iocshArgBuf *args) { - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("traceRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("pvdbcrTraceRecord recordName not specified"); + } + string recordName = string(sval); + int asLevel = args[1].ival; + string asGroup("DEFAULT"); + sval = args[2].sval; + if(sval) { + asGroup = string(sval); } - int asLevel = args[1].ival; PvdbcrTraceRecordPtr record = PvdbcrTraceRecord::create(recordName); record->setAsLevel(asLevel); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + record->setAsGroup(asGroup); + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void pvdbcrTraceRecordRegister(void) From b1822f5fbdb3ce8ea19fed03526b1c1bd05faf0f Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 24 Mar 2021 14:35:05 -0400 Subject: [PATCH 04/20] 1) added canRead for access security 2) main documentation moved to https://mrkraimer.github.io/website/developerGuide/pvDatabase/pvDatabaseCPP.html --- documentation/RELEASE_NOTES.md | 5 + documentation/pvDatabaseCPP.html | 244 ++++--------------------------- src/pv/channelProviderLocal.h | 6 + src/pvAccess/channelLocal.cpp | 44 +++++- 4 files changed, 81 insertions(+), 218 deletions(-) diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index 6df2527..fdfcb44 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -2,6 +2,11 @@ This document summarizes the changes to the module between releases. +## Release 4.6.0 (EPICS 7.0.5.* March 2021) + +* Access Security is now supported. +* Special support has been revised and extended. + ## Release 4.5.3 (EPICS 7.0.5 Feb 2021) * The previously deprecated destroy methods have been removed. diff --git a/documentation/pvDatabaseCPP.html b/documentation/pvDatabaseCPP.html index 5e38a06..f5f6721 100644 --- a/documentation/pvDatabaseCPP.html +++ b/documentation/pvDatabaseCPP.html @@ -4,72 +4,66 @@ - pvDatabaseCPP + EPICS pvDatabaseCPP - - + body { margin-right: 10% } +/*]]>*/ + + + +
-

pvDatabaseCPP

-

Release ? - TBD

-Latest update 2019.09.11. - +

EPICS pvDatabaseCPP

+

Release 4.6.0 - March 2021

Abstract

-

This document describes pvDatabaseCPP, -which is a framework for implementing a network accessible database of smart memory resident +

pvDatabase is a framework for implementing a network accessible database of smart memory resident records. Network access is via pvAccess. The data in each record is a top level PVStructure as defined by pvData. The framework includes a complete implementation of ChannelProvider as defined by pvAccess. The framework can be extended in order to create record instances that implements services. The minimum that an extension must provide is a top level PVStructure and a process method.

+

For more information about EPICS generally, please refer to the home page of the Experimental Physics and Industrial Control System.

-
- -
-

Table of Contents

-
+

-

Overview

+Documentation for pvDatabaseCPP is available at: + +pvDatabase + +

+

pvDatabaseCPP is one of the components of -EPICS Version 7 + +EPICS-7 +

This document is only a guide to help locate code and documentation related to pvDatabaseCPP +

+

It is intended for developers that want to use pvDatabaseCPP.

Developer Guide

@@ -79,204 +73,28 @@ href="https://mrkraimer.github.io/website/developerGuide/developerGuide.html"> developerGuide

-

This guide discusses all the components that are part of an EPICS V4 release. +

This guide provides an overview of the components that are part of an EPICS V4 release. Some understanding of the components and how they are related is necessary in order to develop code that uses pvDatabaseCPP. -In particular read everything related to pvDatabase. -

-

pvDatabase has plugin support, which is implemented in pvCopy. -pvCopy was originally implemented in pvDataCPP, -but pvDatabaseCPP now implements its own version and adds plugin support. -

-

-See - -pvRequest - -for details. -

-

The developerGuide discusses code in a way that applies to both CPP and C++. -For the descriptions of the CPP specific code consult the following sections. +In particular read everything related to pvaClient.

doxygen

doxygen documentation is available at doxgen +href="./html/index.html">doxygen

-

pvDatabaseCPP

-

include/pv

-

The header files that describe the various components implemented by pvDatabase. -

-
-
pvDatabase.h
-
- This describes PVRecord and PVDatabase. -
-
channelProviderLocal.h
-
- This describes a channel provider for PVDatabase -
-
pvSupport.h
-
- This is the base class for support attached to a field of a record. -
-
controlSupport.h
-
- This is support that implements control limits. -
-
scalarAlarmSupport.h
-
- This is support for a alarm limits for a scalar numeric field. -
-
processRecord.h
-
- This is a PVRecord that periodical processes a set of PVRecords in the local PVDatabase. -
-
addRecord.h
-
- This is a PVRecord that adds a new PVRecord to the local PVDatabase. -
-
removeRecord.h
-
- This is a PVRecord that removes a PVRecord in the local PVDatabase. -
-
traceRecord.h
-
- This is a PVRecord that sets the trace value for another PVRecord in the local PVDatabase. -
-
pvStructureCopy.h
-
- This is a facility that allows a client to access a subfield of the fields in a PVRecord. - It also provides record and field options an plugin support. -
-
pvPlugin.h
-
- This is the base class for a plugin attached to a record or field of PVRecord. -
-
pvArrayPlugin.h
-
- A plugin for accessing a subset of the elements in an array field. -
-
pvDeadbandPlugin.h
-
- A deadband plugin for monitors. -
-
pvTimestampPlugin.h
-
- A plugin for timeStamp. -
-
-

src/database

-

This has the code that implements pvDatabase and pvRecord.

-

src/pvAccess

-

This has the code for the channel provider for pvDatabase. -

-

src/support

-

This has the pvSupport code.

-

src/special

-

-This has the code for processRecord, addRecord, removeRecord, and traceRecord. -

-

src/copy

-

This has the code for pvStructureCopy and all the plugin support. -

exampleCPP

-

Example code is available as part of this release. +

Example code is available at exampleCPP

-

In particular look at the example code mentioned in the following sub-sections. +

In particular look at database, exampleLink, and helloPutGet.

-

database

-

This has many examples of how to create both soft records and records that implement -other functionality.

-
-
exampleDatabase.cpp
-
- This shows how to create soft records of each pvData type.
- In addition shows how to create instances of the following two records. -
-
exampleHelloRecord.cpp
-
- This is a simple "hello world" that is intentended to be used via a channelPutGet request. -
-
exampleHelloRPC.cpp
-
- This is a simple "hello world" that is intentended to be used via a channelRPC request. -
-
exampleDatabaseMain.cpp
-
- This shows how to create a standalone IOC. -
-
ioc and iocBoot
-
- This has code and examples to create a V3 IOC which also has a PVDatabase. -
-
-

exampleLink

-

This shows how to implement a record that has a link to another record

-
-
exampleMonitorLinkRecord
-
- This creates a monitor link to another record. -
-
exampleGetLinkRecord
-
- This creates a get link to another record. -
-
examplePutLinkRecord
-
- This creates a put link to another record. -
-
- -

support

-

This creates records that have the following features:

-
-
value
-
- Each record has a value field the is a numeric scalar field. - In addition each has the following fields: - alarm,timeStamp,control,scalarAlarm, and display. -
-
support
-
- Each record uses the control and scalarAlarm support provided by pvDatabaseCPP. -
-
-

-It also creates records that can be used by clients to show example of the plugin support. -

- -

iocshell commands

-

Shell commands are made available via the standard DBD include mechanism -provided by iocCore. -The following provide EPICS V4 shell commands:

-
-pvAccessCPP
-qsrv
-pvDatabaseCPP
-
- -

pvDatabaseCPP provides the following iocshell command.

-
-
registerChannelProviderLocal
-
Including registerChannelProviderLocal.dbd as a dbd file automatically starts provider local - and also creates the pvdbl shell command. -
-
pvdbl
-
Provides a list of all the pvRecords in database master -
-
-

In addition any code that implements a PVRecord must implement an ioc command. -Look at the examples in exampleCPP/support to see how to implement shell commands.

- -
+ diff --git a/src/pv/channelProviderLocal.h b/src/pv/channelProviderLocal.h index 1670e2f..cc7d5f0 100644 --- a/src/pv/channelProviderLocal.h +++ b/src/pv/channelProviderLocal.h @@ -362,6 +362,12 @@ public: * @return true if client can write */ virtual bool canWrite(); + /** + * @brief determines if client can read + * + * @return true if client can read + */ + virtual bool canRead(); protected: shared_pointer getPtrSelf() { diff --git a/src/pvAccess/channelLocal.cpp b/src/pvAccess/channelLocal.cpp index 99acb7b..af2b4ce 100644 --- a/src/pvAccess/channelLocal.cpp +++ b/src/pvAccess/channelLocal.cpp @@ -328,6 +328,13 @@ void ChannelGetLocal::get() { ChannelGetRequester::shared_pointer requester = channelGetRequester.lock(); if(!requester) return; + ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); + if(!channel->canRead()) { + Status status = Status::error("ChannelGet::get is not allowed"); + requester->getDone(status,getPtrSelf(),PVStructurePtr(),BitSetPtr()); + return; + } PVRecordPtr pvr(pvRecord.lock()); if(!pvr) throw std::logic_error("pvRecord is deleted"); try { @@ -489,6 +496,13 @@ void ChannelPutLocal::get() { ChannelPutRequester::shared_pointer requester = channelPutRequester.lock(); if(!requester) return; + ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); + if(!channel->canRead()) { + Status status = Status::error("ChannelPut::get is not allowed"); + requester->getDone(status,getPtrSelf(),PVStructurePtr(),BitSetPtr()); + return; + } PVRecordPtr pvr(pvRecord.lock()); if(!pvr) throw std::logic_error("pvRecord is deleted"); try { @@ -522,7 +536,7 @@ void ChannelPutLocal::put( ChannelLocalPtr channel(channelLocal.lock()); if(!channel) throw std::logic_error("channel is deleted"); if(!channel->canWrite()) { - Status status = Status::error("Channel put is not allowed"); + Status status = Status::error("ChannelPut::put is not allowed"); requester->putDone(status,getPtrSelf()); return; } @@ -689,9 +703,9 @@ void ChannelPutGetLocal::putGet( if(!requester) return; ChannelLocalPtr channel(channelLocal.lock()); if(!channel) throw std::logic_error("channel is deleted"); - if(!channel->canWrite()) { - Status status = Status::error("Channel putGet is not allowed"); - requester->putGetDone(status,getPtrSelf(),pvGetStructure,getBitSet); + if(!channel->canWrite()||!channel->canRead() ) { + Status status = Status::error("ChannelPutGet::putGet is not allowed"); + requester->putGetDone(status,getPtrSelf(),PVStructurePtr(),BitSetPtr()); return; } PVRecordPtr pvr(pvRecord.lock()); @@ -722,6 +736,13 @@ void ChannelPutGetLocal::getPut() { ChannelPutGetRequester::shared_pointer requester = channelPutGetRequester.lock(); if(!requester) return; + ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); + if(!channel->canRead()) { + Status status = Status::error("ChannelPutGet::getPut is not allowed"); + requester->getPutDone(status,getPtrSelf(),PVStructurePtr(),BitSetPtr()); + return; + } PVRecordPtr pvr(pvRecord.lock()); if(!pvr) throw std::logic_error("pvRecord is deleted"); try { @@ -749,6 +770,13 @@ void ChannelPutGetLocal::getGet() { ChannelPutGetRequester::shared_pointer requester = channelPutGetRequester.lock(); if(!requester) return; + ChannelLocalPtr channel(channelLocal.lock()); + if(!channel) throw std::logic_error("channel is deleted"); + if(!channel->canRead()) { + Status status = Status::error("ChannelPutGet::getGet is not allowed"); + requester->getPutDone(status,getPtrSelf(),PVStructurePtr(),BitSetPtr()); + return; + } PVRecordPtr pvr(pvRecord.lock()); if(!pvr) throw std::logic_error("pvRecord is deleted"); try { @@ -1325,9 +1353,15 @@ bool ChannelLocal::canWrite() return false; } +bool ChannelLocal::canRead() +{ + if(!asActive || (asClientPvt && asCheckGet(asClientPvt))) { + return true; + } + return false; +} ChannelLocal::~ChannelLocal() { -// cout << "~ChannelLocal()" << endl; if(asMemberPvt) { asRemoveMember(&asMemberPvt); asMemberPvt = 0; From 4718021e399762e57d9d5966afd07de2a7f94448 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 30 Mar 2021 09:50:23 -0400 Subject: [PATCH 05/20] update documentation --- documentation/RELEASE_NOTES.md | 3 ++- documentation/TODO.md | 8 -------- src/support/controlSupport.cpp | 1 + src/support/scalarAlarmSupport.cpp | 1 + 4 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 documentation/TODO.md diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index fdfcb44..0f13396 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -5,7 +5,8 @@ This document summarizes the changes to the module between releases. ## Release 4.6.0 (EPICS 7.0.5.* March 2021) * Access Security is now supported. -* Special support has been revised and extended. +* special has been revised and extended. +* support is DEPRECATED ## Release 4.5.3 (EPICS 7.0.5 Feb 2021) diff --git a/documentation/TODO.md b/documentation/TODO.md deleted file mode 100644 index 8a6b69a..0000000 --- a/documentation/TODO.md +++ /dev/null @@ -1,8 +0,0 @@ -TODO -=========== - - -create more regression tests ----------------- - -Currently only some simple tests exist. Most of the testing has been via the examples diff --git a/src/support/controlSupport.cpp b/src/support/controlSupport.cpp index 6a582ef..6dc7502 100644 --- a/src/support/controlSupport.cpp +++ b/src/support/controlSupport.cpp @@ -46,6 +46,7 @@ epics::pvData::StructureConstPtr ControlSupport::controlField(ScalarType scalarT ControlSupportPtr ControlSupport::create(PVRecordPtr const & pvRecord) { + cerr << "ControlSupport IS DEPRECATED\n"; ControlSupportPtr support(new ControlSupport(pvRecord)); return support; } diff --git a/src/support/scalarAlarmSupport.cpp b/src/support/scalarAlarmSupport.cpp index de592b7..b911bdf 100644 --- a/src/support/scalarAlarmSupport.cpp +++ b/src/support/scalarAlarmSupport.cpp @@ -48,6 +48,7 @@ epics::pvData::StructureConstPtr ScalarAlarmSupport::scalarAlarmField() ScalarAlarmSupportPtr ScalarAlarmSupport::create(PVRecordPtr const & pvRecord) { + cerr << "ScalarAlarmSupport IS DEPRECATED\n"; ScalarAlarmSupportPtr support(new ScalarAlarmSupport(pvRecord)); return support; } From 4ed8e6d625af5e32f0919a75f94f8a24e11d84d4 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 30 Mar 2021 10:48:22 -0400 Subject: [PATCH 06/20] change order of includes --- src/special/addRecord.cpp | 5 ++--- src/special/processRecord.cpp | 4 ++-- src/special/removeRecord.cpp | 5 ++--- src/special/traceRecord.cpp | 4 ++-- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/special/addRecord.cpp b/src/special/addRecord.cpp index 51fe3e1..7e4fa0b 100644 --- a/src/special/addRecord.cpp +++ b/src/special/addRecord.cpp @@ -25,11 +25,10 @@ #include #include #include - - -#define epicsExportSharedSymbols #include "pv/pvStructureCopy.h" #include "pv/pvDatabase.h" + +#define epicsExportSharedSymbols #include "pv/addRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/processRecord.cpp b/src/special/processRecord.cpp index c93ea3f..936b20e 100644 --- a/src/special/processRecord.cpp +++ b/src/special/processRecord.cpp @@ -27,10 +27,10 @@ #include #include #include - -#define epicsExportSharedSymbols #include "pv/pvStructureCopy.h" #include "pv/pvDatabase.h" + +#define epicsExportSharedSymbols #include "pv/processRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/removeRecord.cpp b/src/special/removeRecord.cpp index a5525a7..c0e12a7 100644 --- a/src/special/removeRecord.cpp +++ b/src/special/removeRecord.cpp @@ -24,11 +24,10 @@ #include #include #include - - -#define epicsExportSharedSymbols #include "pv/pvStructureCopy.h" #include "pv/pvDatabase.h" + +#define epicsExportSharedSymbols #include "pv/removeRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/traceRecord.cpp b/src/special/traceRecord.cpp index 1a32bcb..ba079e0 100644 --- a/src/special/traceRecord.cpp +++ b/src/special/traceRecord.cpp @@ -24,10 +24,10 @@ #include #include #include - -#define epicsExportSharedSymbols #include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" + +#define epicsExportSharedSymbols #include "pv/traceRecord.h" using std::tr1::static_pointer_cast; From 120fa2255806e4f39776f44bf8e7e8bae5dfa595 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 30 Mar 2021 12:58:01 -0400 Subject: [PATCH 07/20] remove nt --- src/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Makefile b/src/Makefile index d40399f..0e6db8c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,7 +39,6 @@ include $(PVDATABASE_SRC)/pvAccess/Makefile include $(PVDATABASE_SRC)/special/Makefile include $(PVDATABASE_SRC)/support/Makefile -pvDatabase_LIBS += nt pvDatabase_LIBS += $(EPICS_BASE_PVA_CORE_LIBS) pvDatabase_LIBS += $(EPICS_BASE_IOC_LIBS) From 2d61b4c0f380fa52b8b6ab32b88e5509cc506661 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 30 Mar 2021 16:04:50 -0400 Subject: [PATCH 08/20] fix include order --- src/special/addRecordRegister.cpp | 4 ++-- src/special/processRecordRegister.cpp | 4 ++-- src/special/removeRecordRegister.cpp | 4 ++-- src/special/traceRecordRegister.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 4dee555..4a14fa3 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -18,12 +18,12 @@ #include #include #include +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #include "pv/addRecord.h" using namespace epics::pvData; diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index 985f476..137c9b7 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -19,12 +19,12 @@ #include #include #include +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #include "pv/processRecord.h" diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index 4976c3e..efba5fb 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -18,12 +18,12 @@ #include #include #include +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #include "pv/removeRecord.h" using namespace epics::pvData; diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp index 3c60400..3f56f01 100644 --- a/src/special/traceRecordRegister.cpp +++ b/src/special/traceRecordRegister.cpp @@ -19,12 +19,12 @@ #include #include #include +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #include "pv/traceRecord.h" using namespace epics::pvData; From 7143a8585f554df98f9cdffcdd5459c9a557416b Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Tue, 30 Mar 2021 18:29:11 -0400 Subject: [PATCH 09/20] more changes to includes --- src/special/addRecordRegister.cpp | 15 +++++++-------- src/special/processRecordRegister.cpp | 16 +++++++--------- src/special/pvdbcrProcessRecordRegister.cpp | 3 +-- src/special/removeRecordRegister.cpp | 14 +++++++------- src/special/traceRecordRegister.cpp | 16 +++++++--------- 5 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 4a14fa3..8ec2158 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -10,16 +10,15 @@ /* Author: Marty Kraimer */ -#include #include -#include -#include -#include -#include +#include +#include +#include #include -#include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" +#include +#include +#include +#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index 137c9b7..ee77594 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -10,17 +10,15 @@ /* Author: Marty Kraimer */ - -#include #include -#include -#include -#include -#include +#include +#include +#include #include -#include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" +#include +#include +#include +#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index f029fd8..df7e4cc 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -7,8 +7,7 @@ * @author mrk * @date 2021.03.12 */ -#include -#include + #include #include #include #include diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index efba5fb..f57a901 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -12,14 +12,14 @@ /* Author: Marty Kraimer */ #include #include -#include -#include -#include -#include +#include +#include +#include #include -#include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" +#include +#include +#include +#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp index 3f56f01..c0c87f9 100644 --- a/src/special/traceRecordRegister.cpp +++ b/src/special/traceRecordRegister.cpp @@ -10,17 +10,15 @@ /* Author: Marty Kraimer */ - -#include #include -#include -#include -#include -#include +#include +#include +#include #include -#include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" +#include +#include +#include +#include // The following must be the last include for code pvDatabase uses #include From 2a4d3a15f8b2fb2d2500d8e71e4cb8c051364ed1 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 05:58:46 -0400 Subject: [PATCH 10/20] try adding pvaClient to src/Makefile --- src/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Makefile b/src/Makefile index 0e6db8c..fe0b788 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,6 +39,7 @@ include $(PVDATABASE_SRC)/pvAccess/Makefile include $(PVDATABASE_SRC)/special/Makefile include $(PVDATABASE_SRC)/support/Makefile +pvDatabase_LIBS += pvaClient pvDatabase_LIBS += $(EPICS_BASE_PVA_CORE_LIBS) pvDatabase_LIBS += $(EPICS_BASE_IOC_LIBS) From 22e849c6f7c15a979345f3f421fefec8801b4251 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 07:39:56 -0400 Subject: [PATCH 11/20] remove all references to pvaClient --- src/Makefile | 1 - src/special/addRecordRegister.cpp | 1 - src/special/processRecordRegister.cpp | 1 - src/special/pvdbcrAddRecordRegister.cpp | 2 -- src/special/pvdbcrProcessRecordRegister.cpp | 6 +++--- src/special/pvdbcrRemoveRecordRegister.cpp | 2 -- src/special/pvdbcrTraceRecordRegister.cpp | 2 -- src/special/removeRecordRegister.cpp | 1 - src/special/traceRecordRegister.cpp | 1 - 9 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/Makefile b/src/Makefile index fe0b788..0e6db8c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -39,7 +39,6 @@ include $(PVDATABASE_SRC)/pvAccess/Makefile include $(PVDATABASE_SRC)/special/Makefile include $(PVDATABASE_SRC)/support/Makefile -pvDatabase_LIBS += pvaClient pvDatabase_LIBS += $(EPICS_BASE_PVA_CORE_LIBS) pvDatabase_LIBS += $(EPICS_BASE_IOC_LIBS) diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 8ec2158..03fa2c4 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -18,7 +18,6 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index ee77594..bebc999 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -18,7 +18,6 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index ae18beb..db1963e 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -15,7 +15,6 @@ #include #include #include -#include // The following must be the last include for code exampleLink uses #include @@ -24,7 +23,6 @@ using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; -using namespace epics::pvaClient; using namespace std; class PvdbcrAddRecord; diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index df7e4cc..e7f1c38 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -7,7 +7,9 @@ * @author mrk * @date 2021.03.12 */ - #include +#include +#include +#include #include #include #include @@ -16,7 +18,6 @@ #include #include #include -#include // The following must be the last include for code exampleLink uses #include @@ -25,7 +26,6 @@ using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; -using namespace epics::pvaClient; using namespace std; typedef std::tr1::shared_ptr EpicsThreadPtr; diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp index 477cb51..6fb00ec 100644 --- a/src/special/pvdbcrRemoveRecordRegister.cpp +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -15,7 +15,6 @@ #include #include #include -#include // The following must be the last include for code exampleLink uses #include @@ -24,7 +23,6 @@ using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; -using namespace epics::pvaClient; using namespace std; class PvdbcrRemoveRecord; diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index ac394e6..8d06762 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -15,7 +15,6 @@ #include #include #include -#include // The following must be the last include for code exampleLink uses #include @@ -24,7 +23,6 @@ using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; -using namespace epics::pvaClient; using namespace std; class PvdbcrTraceRecord; diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index f57a901..418a9a3 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -19,7 +19,6 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp index c0c87f9..ce555eb 100644 --- a/src/special/traceRecordRegister.cpp +++ b/src/special/traceRecordRegister.cpp @@ -18,7 +18,6 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include From 58a603556b14699bd7d7fc1c68e0e40fea66c533 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 08:32:34 -0400 Subject: [PATCH 12/20] add using std::tr1::static_pointer_cast --- src/special/pvdbcrAddRecordRegister.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index db1963e..e1cd121 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -20,6 +20,7 @@ #include #define epicsExportSharedSymbols +using std::tr1::static_pointer_cast; using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; From bf82de407eef6f5a620f9e94721f9a55faf8c1c0 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 10:57:48 -0400 Subject: [PATCH 13/20] still more work on includes --- src/special/addRecord.cpp | 4 ++-- src/special/addRecordRegister.cpp | 2 +- src/special/processRecord.cpp | 4 ++-- src/special/processRecordRegister.cpp | 2 +- src/special/pvdbcrAddRecordRegister.cpp | 3 +-- src/special/pvdbcrProcessRecordRegister.cpp | 5 ++--- src/special/pvdbcrRemoveRecordRegister.cpp | 4 +--- src/special/pvdbcrScalarArrayRegister.cpp | 6 +++--- src/special/pvdbcrScalarRegister.cpp | 5 ++--- src/special/pvdbcrTraceRecordRegister.cpp | 4 ++-- src/special/removeRecord.cpp | 4 ++-- src/special/removeRecordRegister.cpp | 2 +- src/special/traceRecord.cpp | 4 ++-- 13 files changed, 22 insertions(+), 27 deletions(-) diff --git a/src/special/addRecord.cpp b/src/special/addRecord.cpp index 7e4fa0b..698c8d4 100644 --- a/src/special/addRecord.cpp +++ b/src/special/addRecord.cpp @@ -25,10 +25,10 @@ #include #include #include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" #include "pv/addRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 03fa2c4..3306044 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -17,11 +17,11 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols +#include "pv/pvDatabase.h" #include "pv/addRecord.h" using namespace epics::pvData; diff --git a/src/special/processRecord.cpp b/src/special/processRecord.cpp index 936b20e..c93ea3f 100644 --- a/src/special/processRecord.cpp +++ b/src/special/processRecord.cpp @@ -27,10 +27,10 @@ #include #include #include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" #include "pv/processRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index bebc999..d69cda3 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -17,11 +17,11 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols +#include "pv/pvDatabase.h" #include "pv/processRecord.h" diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index e1cd121..5a8878c 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -14,12 +14,11 @@ #include #include #include -#include // The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols - +#include "pv/pvDatabase.h" using std::tr1::static_pointer_cast; using namespace epics::pvData; using namespace epics::pvAccess; diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index e7f1c38..9252fe2 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -8,6 +8,7 @@ * @date 2021.03.12 */ #include +#include #include #include #include @@ -17,12 +18,10 @@ #include #include #include -#include -// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols - +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp index 6fb00ec..60ba8ac 100644 --- a/src/special/pvdbcrRemoveRecordRegister.cpp +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -14,12 +14,10 @@ #include #include #include -#include -// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols - +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; diff --git a/src/special/pvdbcrScalarArrayRegister.cpp b/src/special/pvdbcrScalarArrayRegister.cpp index 5e0a3da..d384486 100644 --- a/src/special/pvdbcrScalarArrayRegister.cpp +++ b/src/special/pvdbcrScalarArrayRegister.cpp @@ -12,11 +12,11 @@ /* Author: Marty Kraimer */ #include #include -#include -// The following must be the last include for code exampleLink uses + +// The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols - +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvDatabase; using namespace std; diff --git a/src/special/pvdbcrScalarRegister.cpp b/src/special/pvdbcrScalarRegister.cpp index c6688cc..2230b30 100644 --- a/src/special/pvdbcrScalarRegister.cpp +++ b/src/special/pvdbcrScalarRegister.cpp @@ -9,11 +9,10 @@ */ #include #include -#include -// The following must be the last include for code exampleLink uses +// The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols - +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvDatabase; using namespace std; diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index 8d06762..d6f2b28 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -14,11 +14,11 @@ #include #include #include -#include -// The following must be the last include for code exampleLink uses +// The following must be the last include #include #define epicsExportSharedSymbols +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; diff --git a/src/special/removeRecord.cpp b/src/special/removeRecord.cpp index c0e12a7..6bfc975 100644 --- a/src/special/removeRecord.cpp +++ b/src/special/removeRecord.cpp @@ -24,10 +24,10 @@ #include #include #include -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/pvDatabase.h" #include "pv/removeRecord.h" using std::tr1::static_pointer_cast; diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index 418a9a3..280ee17 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -18,11 +18,11 @@ #include #include #include -#include // The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols +#include "pv/pvDatabase.h" #include "pv/removeRecord.h" using namespace epics::pvData; diff --git a/src/special/traceRecord.cpp b/src/special/traceRecord.cpp index ba079e0..1a32bcb 100644 --- a/src/special/traceRecord.cpp +++ b/src/special/traceRecord.cpp @@ -24,10 +24,10 @@ #include #include #include -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" #include "pv/traceRecord.h" using std::tr1::static_pointer_cast; From 9d10b039fb3d74921a8b3b557804786d7586a2f0 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 12:25:44 -0400 Subject: [PATCH 14/20] another attempt to get pull request to build --- src/special/Makefile | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/special/Makefile b/src/special/Makefile index 15061da..744c1fb 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,6 +2,20 @@ SRC_DIRS += $(PVDATABASE_SRC)/special +LIBSRCS += traceRecord.cpp +LIBSRCS += removeRecord.cpp +LIBSRCS += addRecord.cpp +LIBSRCS += processRecord.cpp + +DBD += traceRecordRegister.dbd +DBD += removeRecordRegister.dbd +DBD += addRecordRegister.dbd +DBD += processRecordRegister.dbd + +LIBSRCS += traceRecordRegister.cpp +LIBSRCS += removeRecordRegister.cpp +LIBSRCS += addRecordRegister.cpp +LIBSRCS += processRecordRegister.cpp DBD += pvdbcrTraceRecordRegister.dbd DBD += pvdbcrRemoveRecordRegister.dbd @@ -18,17 +32,3 @@ LIBSRCS += pvdbcrProcessRecordRegister.cpp LIBSRCS += pvdbcrScalarRegister.cpp LIBSRCS += pvdbcrScalarArrayRegister.cpp -LIBSRCS += traceRecord.cpp -LIBSRCS += removeRecord.cpp -LIBSRCS += addRecord.cpp -LIBSRCS += processRecord.cpp - -DBD += traceRecordRegister.dbd -DBD += removeRecordRegister.dbd -DBD += addRecordRegister.dbd -DBD += processRecordRegister.dbd - -LIBSRCS += traceRecordRegister.cpp -LIBSRCS += removeRecordRegister.cpp -LIBSRCS += addRecordRegister.cpp -LIBSRCS += processRecordRegister.cpp From 895698c3cda844d3c950bc95725a7b344df0a4a6 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 13:05:51 -0400 Subject: [PATCH 15/20] another attempt to get pull request to build --- src/special/pvdbcrTraceRecordRegister.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index d6f2b28..ed3e242 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -7,13 +7,15 @@ * @author mrk * @date 2021.03.12 */ - #include +#include #include #include #include #include #include #include +#include +#include // The following must be the last include #include From 72c2489921266deed82d0c0bf6314f3960271981 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Wed, 31 Mar 2021 14:31:06 -0400 Subject: [PATCH 16/20] another attempt to get pull request to build --- src/special/pvdbcrAddRecordRegister.cpp | 3 +++ src/special/pvdbcrProcessRecordRegister.cpp | 4 ++++ src/special/pvdbcrRemoveRecordRegister.cpp | 4 ++++ src/special/pvdbcrScalarArrayRegister.cpp | 4 ++++ src/special/pvdbcrScalarRegister.cpp | 4 ++++ src/special/pvdbcrTraceRecordRegister.cpp | 1 + 6 files changed, 20 insertions(+) diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index 5a8878c..560a54a 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -14,6 +14,9 @@ #include #include #include +#include +#include + // The following must be the last include for code exampleLink uses #include diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index 9252fe2..7ea7600 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -18,9 +18,13 @@ #include #include #include +#include +#include + #include #define epicsExportSharedSymbols +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp index 60ba8ac..553fa66 100644 --- a/src/special/pvdbcrRemoveRecordRegister.cpp +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -14,9 +14,13 @@ #include #include #include +#include +#include + #include #define epicsExportSharedSymbols +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; diff --git a/src/special/pvdbcrScalarArrayRegister.cpp b/src/special/pvdbcrScalarArrayRegister.cpp index d384486..a385516 100644 --- a/src/special/pvdbcrScalarArrayRegister.cpp +++ b/src/special/pvdbcrScalarArrayRegister.cpp @@ -12,10 +12,14 @@ /* Author: Marty Kraimer */ #include #include +#include +#include + // The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvDatabase; diff --git a/src/special/pvdbcrScalarRegister.cpp b/src/special/pvdbcrScalarRegister.cpp index 2230b30..5078ff3 100644 --- a/src/special/pvdbcrScalarRegister.cpp +++ b/src/special/pvdbcrScalarRegister.cpp @@ -9,9 +9,13 @@ */ #include #include +#include +#include + // The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvDatabase; diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index ed3e242..be1233b 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -20,6 +20,7 @@ // The following must be the last include #include #define epicsExportSharedSymbols +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; From a1514e52063b13d03cf8feeb0e673a87dfdce5c0 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Thu, 1 Apr 2021 06:15:46 -0400 Subject: [PATCH 17/20] another attempt to get pull request to build --- src/special/pvdbcrAddRecordRegister.cpp | 3 ++- src/special/pvdbcrProcessRecordRegister.cpp | 2 +- src/special/pvdbcrRemoveRecordRegister.cpp | 2 +- src/special/pvdbcrScalarArrayRegister.cpp | 2 +- src/special/pvdbcrScalarRegister.cpp | 1 + src/special/pvdbcrTraceRecordRegister.cpp | 1 + 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/special/pvdbcrAddRecordRegister.cpp b/src/special/pvdbcrAddRecordRegister.cpp index 560a54a..c8a69d1 100644 --- a/src/special/pvdbcrAddRecordRegister.cpp +++ b/src/special/pvdbcrAddRecordRegister.cpp @@ -17,10 +17,11 @@ #include #include - // The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using std::tr1::static_pointer_cast; using namespace epics::pvData; diff --git a/src/special/pvdbcrProcessRecordRegister.cpp b/src/special/pvdbcrProcessRecordRegister.cpp index 7ea7600..bfac05c 100644 --- a/src/special/pvdbcrProcessRecordRegister.cpp +++ b/src/special/pvdbcrProcessRecordRegister.cpp @@ -21,9 +21,9 @@ #include #include - #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; diff --git a/src/special/pvdbcrRemoveRecordRegister.cpp b/src/special/pvdbcrRemoveRecordRegister.cpp index 553fa66..561faa6 100644 --- a/src/special/pvdbcrRemoveRecordRegister.cpp +++ b/src/special/pvdbcrRemoveRecordRegister.cpp @@ -17,9 +17,9 @@ #include #include - #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; diff --git a/src/special/pvdbcrScalarArrayRegister.cpp b/src/special/pvdbcrScalarArrayRegister.cpp index a385516..eb43c0b 100644 --- a/src/special/pvdbcrScalarArrayRegister.cpp +++ b/src/special/pvdbcrScalarArrayRegister.cpp @@ -15,10 +15,10 @@ #include #include - // The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; diff --git a/src/special/pvdbcrScalarRegister.cpp b/src/special/pvdbcrScalarRegister.cpp index 5078ff3..c60de79 100644 --- a/src/special/pvdbcrScalarRegister.cpp +++ b/src/special/pvdbcrScalarRegister.cpp @@ -15,6 +15,7 @@ // The following must be the last include for code pvDatabase implements #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" using namespace epics::pvData; diff --git a/src/special/pvdbcrTraceRecordRegister.cpp b/src/special/pvdbcrTraceRecordRegister.cpp index be1233b..d5439e7 100644 --- a/src/special/pvdbcrTraceRecordRegister.cpp +++ b/src/special/pvdbcrTraceRecordRegister.cpp @@ -20,6 +20,7 @@ // The following must be the last include #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" #include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" From 17f43b4452532d8df57b01382153eab9f491d5e9 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Thu, 1 Apr 2021 07:15:26 -0400 Subject: [PATCH 18/20] another attempt to get pull request to build --- src/Makefile | 8 ++++---- src/special/Makefile | 24 ++++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Makefile b/src/Makefile index 0e6db8c..dfb2873 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,10 +23,10 @@ INC += pv/pvDatabase.h INC += pv/channelProviderLocal.h -INC += pv/traceRecord.h -INC += pv/removeRecord.h -INC += pv/addRecord.h -INC += pv/processRecord.h +#INC += pv/traceRecord.h +#INC += pv/removeRecord.h +#INC += pv/addRecord.h +#INC += pv/processRecord.h INC += pv/pvSupport.h INC += pv/controlSupport.h diff --git a/src/special/Makefile b/src/special/Makefile index 744c1fb..65b4942 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,20 +2,20 @@ SRC_DIRS += $(PVDATABASE_SRC)/special -LIBSRCS += traceRecord.cpp -LIBSRCS += removeRecord.cpp -LIBSRCS += addRecord.cpp -LIBSRCS += processRecord.cpp +#LIBSRCS += traceRecord.cpp +#LIBSRCS += removeRecord.cpp +#LIBSRCS += addRecord.cpp +#LIBSRCS += processRecord.cpp -DBD += traceRecordRegister.dbd -DBD += removeRecordRegister.dbd -DBD += addRecordRegister.dbd -DBD += processRecordRegister.dbd +#DBD += traceRecordRegister.dbd +#DBD += removeRecordRegister.dbd +#DBD += addRecordRegister.dbd +#DBD += processRecordRegister.dbd -LIBSRCS += traceRecordRegister.cpp -LIBSRCS += removeRecordRegister.cpp -LIBSRCS += addRecordRegister.cpp -LIBSRCS += processRecordRegister.cpp +#LIBSRCS += traceRecordRegister.cpp +#LIBSRCS += removeRecordRegister.cpp +#LIBSRCS += addRecordRegister.cpp +#LIBSRCS += processRecordRegister.cpp DBD += pvdbcrTraceRecordRegister.dbd DBD += pvdbcrRemoveRecordRegister.dbd From 0481a7bf5b1acff9eeb0ca65555e25852c3436bd Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Thu, 1 Apr 2021 08:22:34 -0400 Subject: [PATCH 19/20] redo addRecord, removeRecord, processRecord, and traceRecord --- src/Makefile | 5 - src/pv/addRecord.h | 63 --------- src/pv/processRecord.h | 89 ------------ src/pv/removeRecord.h | 63 --------- src/pv/traceRecord.h | 66 --------- src/special/Makefile | 21 ++- src/special/addRecord.cpp | 116 ---------------- src/special/addRecordRegister.cpp | 133 +++++++++++++++--- src/special/processRecord.cpp | 166 ---------------------- src/special/processRecordRegister.cpp | 193 +++++++++++++++++++++++--- src/special/removeRecord.cpp | 91 ------------ src/special/removeRecordRegister.cpp | 103 +++++++++++--- src/special/traceRecord.cpp | 95 ------------- src/special/traceRecordRegister.cpp | 108 +++++++++++--- 14 files changed, 476 insertions(+), 836 deletions(-) delete mode 100644 src/pv/addRecord.h delete mode 100644 src/pv/processRecord.h delete mode 100644 src/pv/removeRecord.h delete mode 100644 src/pv/traceRecord.h delete mode 100644 src/special/addRecord.cpp delete mode 100644 src/special/processRecord.cpp delete mode 100644 src/special/removeRecord.cpp delete mode 100644 src/special/traceRecord.cpp diff --git a/src/Makefile b/src/Makefile index dfb2873..e0cb91c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,11 +23,6 @@ INC += pv/pvDatabase.h INC += pv/channelProviderLocal.h -#INC += pv/traceRecord.h -#INC += pv/removeRecord.h -#INC += pv/addRecord.h -#INC += pv/processRecord.h - INC += pv/pvSupport.h INC += pv/controlSupport.h INC += pv/scalarAlarmSupport.h diff --git a/src/pv/addRecord.h b/src/pv/addRecord.h deleted file mode 100644 index ef3ed17..0000000 --- a/src/pv/addRecord.h +++ /dev/null @@ -1,63 +0,0 @@ -/* addRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ -#ifndef ADDRECORD_H -#define ADDRECORD_H - -#include - -#include - -namespace epics { namespace pvDatabase { - - -class AddRecord; -typedef std::tr1::shared_ptr AddRecordPtr; - -/** - * @brief Add another record in the same database. - * - * A record to add another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass AddRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(AddRecord); - /** - * Factory methods to create AddRecord. - * @param recordName The name for the AddRecord. - * @return A shared pointer to AddRecord.. - */ - static AddRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Add the record specified by recordName. - */ - virtual void process(); -private: - AddRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* ADDRECORD_H */ diff --git a/src/pv/processRecord.h b/src/pv/processRecord.h deleted file mode 100644 index 6607e93..0000000 --- a/src/pv/processRecord.h +++ /dev/null @@ -1,89 +0,0 @@ -/* processRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2019.06.07 - */ -#ifndef PROCESSRECORD_H -#define PROCESSRECORD_H - -#include -#include -#include -#include - -#include - -namespace epics { namespace pvDatabase { - -typedef std::tr1::shared_ptr EpicsThreadPtr; - -class ProcessRecord; -typedef std::tr1::shared_ptr ProcessRecordPtr; - -/** - * @brief Process another record in the same database. - * - * A record to process another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass ProcessRecord : - public PVRecord, - public epicsThreadRunable -{ -public: - POINTER_DEFINITIONS(ProcessRecord); - /** - * Factory methods to create ProcessRecord. - * @param recordName The name for the ProcessRecord. - * @param delay Delay time to wait between process requests. - * @return A shared pointer to ProcessRecord. - */ - static ProcessRecordPtr create( - std::string const & recordName,double delay); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Process the record specified by recordName. - */ - virtual void process(); - /** - * @brief The run method for the thread. - */ - virtual void run(); - /** - * @brief Start the thread - */ - void startThread(); - /** - * @brief Stop the thread - */ - void stop(); -private: - ProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay); - double delay; - EpicsThreadPtr thread; - epics::pvData::Event runStop; - epics::pvData::Event runReturn; - PVDatabasePtr pvDatabase; - PVRecordMap pvRecordMap; - epics::pvData::PVStringPtr pvCommand; - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; - epics::pvData::Mutex mutex; -}; - -}} - -#endif /* PROCESSRECORD_H */ diff --git a/src/pv/removeRecord.h b/src/pv/removeRecord.h deleted file mode 100644 index d101e1c..0000000 --- a/src/pv/removeRecord.h +++ /dev/null @@ -1,63 +0,0 @@ -/* removeRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ -#ifndef REMOVERECORD_H -#define REMOVERECORD_H - -#include - -#include - -namespace epics { namespace pvDatabase { - - -class RemoveRecord; -typedef std::tr1::shared_ptr RemoveRecordPtr; - -/** - * @brief Remove another record in the same database. - * - * A record to remove another record - * It is meant to be used via a channelPutGet request. - * The argument has one field: recordName. - * The result has a field named status. - */ -class epicsShareClass RemoveRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(RemoveRecord); - /** - * Factory methods to create RemoveRecord. - * @param recordName The name for the RemoveRecord. - * @return A shared pointer to RemoveRecord.. - */ - static RemoveRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Remove the record specified by recordName. - */ - virtual void process(); -private: - RemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* REMOVERECORD_H */ diff --git a/src/pv/traceRecord.h b/src/pv/traceRecord.h deleted file mode 100644 index 6ec5525..0000000 --- a/src/pv/traceRecord.h +++ /dev/null @@ -1,66 +0,0 @@ -/* traceRecord.h */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ -#ifndef TRACERECORD_H -#define TRACERECORD_H - -#include - -#include - - -namespace epics { namespace pvDatabase { - - -class TraceRecord; -typedef std::tr1::shared_ptr TraceRecordPtr; - -/** - * @brief Trace activity of PVRecord. - * - * A record to set the trace value for another record - * It is meant to be used via a channelPutGet request. - * The argument has two fields: recordName and level. - * The result has a field named status. - */ -class epicsShareClass TraceRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(TraceRecord); - /** - * @brief Factory method to create TraceRecord. - * - * @param recordName The name for the TraceRecord. - * @return A shared pointer to TraceRecord.. - */ - static TraceRecordPtr create( - std::string const & recordName); - /** - * standard init method required by PVRecord - * @return true unless record name already exists. - */ - virtual bool init(); - /** - * @brief Set the trace level for record specified by recordName. - */ - virtual void process(); -private: - TraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVIntPtr pvLevel; - epics::pvData::PVStringPtr pvResult; -}; - -}} - -#endif /* TRACERECORD_H */ diff --git a/src/special/Makefile b/src/special/Makefile index 65b4942..95aa467 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,20 +2,15 @@ SRC_DIRS += $(PVDATABASE_SRC)/special -#LIBSRCS += traceRecord.cpp -#LIBSRCS += removeRecord.cpp -#LIBSRCS += addRecord.cpp -#LIBSRCS += processRecord.cpp +DBD += traceRecordRegister.dbd +DBD += removeRecordRegister.dbd +DBD += addRecordRegister.dbd +DBD += processRecordRegister.dbd -#DBD += traceRecordRegister.dbd -#DBD += removeRecordRegister.dbd -#DBD += addRecordRegister.dbd -#DBD += processRecordRegister.dbd - -#LIBSRCS += traceRecordRegister.cpp -#LIBSRCS += removeRecordRegister.cpp -#LIBSRCS += addRecordRegister.cpp -#LIBSRCS += processRecordRegister.cpp +LIBSRCS += traceRecordRegister.cpp +LIBSRCS += removeRecordRegister.cpp +LIBSRCS += addRecordRegister.cpp +LIBSRCS += processRecordRegister.cpp DBD += pvdbcrTraceRecordRegister.dbd DBD += pvdbcrRemoveRecordRegister.dbd diff --git a/src/special/addRecord.cpp b/src/special/addRecord.cpp deleted file mode 100644 index 698c8d4..0000000 --- a/src/special/addRecord.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* addRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/addRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -AddRecordPtr AddRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - addNestedUnion("union") -> - endNested()-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - AddRecordPtr pvRecord( - new AddRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -AddRecord::AddRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool AddRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void AddRecord::process() -{ - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(pvRecord) { - pvResult->put(name + " already exists"); - return; - } - PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); - if(!pvUnion) { - pvResult->put(name + " argument.union is NULL"); - return; - } - PVFieldPtr pvField(pvUnion->get()); - if(!pvField) { - pvResult->put(name + " union has no value"); - return; - } - if(pvField->getField()->getType()!=epics::pvData::structure) { - pvResult->put(name + " union most be a structure"); - return; - } - StructureConstPtr st = static_pointer_cast(pvField->getField()); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); - PVRecordPtr pvRec = PVRecord::create(name,pvStructure); - bool result = PVDatabase::getMaster()->addRecord(pvRec); - if(result) { - pvResult->put("success"); - } else { - pvResult->put("failure"); - } -} - - -}} diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp index 3306044..d39d0cd 100644 --- a/src/special/addRecordRegister.cpp +++ b/src/special/addRecordRegister.cpp @@ -5,11 +5,8 @@ /** * @author mrk - * @date 2013.07.24 + * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ #include #include #include @@ -17,37 +14,137 @@ #include #include #include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include for code exampleLink uses #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" -#include "pv/addRecord.h" - +using std::tr1::static_pointer_cast; using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg *testArgs[] = { - &testArg0}; +class AddRecord; +typedef std::tr1::shared_ptr AddRecordPtr; -static const iocshFuncDef addRecordFuncDef = {"addRecordCreate", 1,testArgs}; + +class epicsShareClass AddRecord : + public PVRecord +{ +private: + AddRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +public: + POINTER_DEFINITIONS(AddRecord); + + static AddRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +}; + +AddRecordPtr AddRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + addNestedUnion("union") -> + endNested()-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + AddRecordPtr pvRecord( + new AddRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +AddRecord::AddRecord( + std::string const & recordName, + PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool AddRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void AddRecord::process() +{ + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(pvRecord) { + pvResult->put(name + " already exists"); + return; + } + PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); + if(!pvUnion) { + pvResult->put(name + " argument.union is NULL"); + return; + } + PVFieldPtr pvField(pvUnion->get()); + if(!pvField) { + pvResult->put(name + " union has no value"); + return; + } + if(pvField->getField()->getType()!=epics::pvData::structure) { + pvResult->put(name + " union most be a structure"); + return; + } + StructureConstPtr st = static_pointer_cast(pvField->getField()); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); + PVRecordPtr pvRec = PVRecord::create(name,pvStructure); + bool result = PVDatabase::getMaster()->addRecord(pvRec); + if(result) { + pvResult->put("success"); + } else { + pvResult->put("failure"); + } +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg *args[] = {&arg0}; + +static const iocshFuncDef addRecordFuncDef = {"addRecordCreate", 1,args}; static void addRecordCallFunc(const iocshArgBuf *args) { cerr << "DEPRECATED use pvdbcrAddRecord instead\n"; - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("addRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("addRecordCreate recordName not specified"); } + string recordName = string(sval); AddRecordPtr record = AddRecord::create(recordName); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } -static void addRecordRegister(void) +static void addRecordCreateRegister(void) { static int firstTime = 1; if (firstTime) { @@ -57,5 +154,5 @@ static void addRecordRegister(void) } extern "C" { - epicsExportRegistrar(addRecordRegister); + epicsExportRegistrar(addRecordCreateRegister); } diff --git a/src/special/processRecord.cpp b/src/special/processRecord.cpp deleted file mode 100644 index c93ea3f..0000000 --- a/src/special/processRecord.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* processRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/processRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -ProcessRecordPtr ProcessRecord::create( - std::string const & recordName,double delay) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("command",pvString)-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - ProcessRecordPtr pvRecord( - new ProcessRecord(recordName,pvStructure,delay)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -void ProcessRecord::startThread() -{ - thread = EpicsThreadPtr(new epicsThread( - *this, - "processRecord", - epicsThreadGetStackSize(epicsThreadStackSmall), - epicsThreadPriorityLow)); - thread->start(); -} - -void ProcessRecord::stop() -{ - runStop.signal(); - runReturn.wait(); -} - - -ProcessRecord::ProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay) -: PVRecord(recordName,pvStructure), - delay(delay), - pvDatabase(PVDatabase::getMaster()) -{ -} - -bool ProcessRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvCommand = pvStructure->getSubField("argument.command"); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - startThread(); - return true; -} - -void ProcessRecord::process() -{ - string recordName = pvRecordName->get(); - string command = pvCommand->get(); - if(command.compare("add")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter!=pvRecordMap.end()) { - pvResult->put(recordName + " already present"); - return; - } - PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); - if(!pvRecord) { - pvResult->put(recordName + " not in pvDatabase"); - return; - } - pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); - pvResult->put("success"); - return; - } else if(command.compare("remove")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter==pvRecordMap.end()) { - pvResult->put(recordName + " not found"); - return; - } - pvRecordMap.erase(iter); - pvResult->put("success"); - return; - } else { - pvResult->put(command + " not a valid command: only add and remove are valid"); - return; - } -} - -void ProcessRecord::run() -{ - while(true) { - if(runStop.tryWait()) { - runReturn.signal(); - return; - } - if(delay>0.0) epicsThreadSleep(delay); - epicsGuard guard(mutex); - PVRecordMap::iterator iter; - for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { - PVRecordPtr pvRecord = (*iter).second; - pvRecord->lock(); - pvRecord->beginGroupPut(); - try { - pvRecord->process(); - } catch (std::exception& ex) { - std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; - } catch (...) { - std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; - } - pvRecord->endGroupPut(); - pvRecord->unlock(); - } - } -} - - -}} diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp index d69cda3..9293b15 100644 --- a/src/special/processRecordRegister.cpp +++ b/src/special/processRecordRegister.cpp @@ -5,11 +5,12 @@ /** * @author mrk - * @date 2013.07.24 + * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ +#include +#include +#include +#include #include #include #include @@ -17,38 +18,194 @@ #include #include #include +#include +#include -// The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" -#include "pv/processRecord.h" - - using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg testArg1 = { "delay", iocshArgDouble }; -static const iocshArg *testArgs[] = { - &testArg0,&testArg1}; +typedef std::tr1::shared_ptr EpicsThreadPtr; +class ProcessRecord; +typedef std::tr1::shared_ptr ProcessRecordPtr; -static const iocshFuncDef processRecordFuncDef = {"processRecordCreate", 2,testArgs}; +class epicsShareClass ProcessRecord : + public PVRecord, + public epicsThreadRunable +{ +public: + POINTER_DEFINITIONS(ProcessRecord); + static ProcessRecordPtr create( + std::string const & recordName,double delay); + virtual bool init(); + virtual void process(); + virtual void run(); + void startThread(); + void stop(); +private: + ProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay); + double delay; + EpicsThreadPtr thread; + epics::pvData::Event runStop; + epics::pvData::Event runReturn; + PVDatabasePtr pvDatabase; + PVRecordMap pvRecordMap; + epics::pvData::PVStringPtr pvCommand; + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; + epics::pvData::Mutex mutex; +}; + +ProcessRecordPtr ProcessRecord::create( + std::string const & recordName,double delay) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("command",pvString)-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + ProcessRecordPtr pvRecord( + new ProcessRecord(recordName,pvStructure,delay)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +void ProcessRecord::startThread() +{ + thread = EpicsThreadPtr(new epicsThread( + *this, + "processRecord", + epicsThreadGetStackSize(epicsThreadStackSmall), + epicsThreadPriorityLow)); + thread->start(); +} + +void ProcessRecord::stop() +{ + runStop.signal(); + runReturn.wait(); +} + + +ProcessRecord::ProcessRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure,double delay) +: PVRecord(recordName,pvStructure), + delay(delay), + pvDatabase(PVDatabase::getMaster()) +{ +} + +bool ProcessRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvCommand = pvStructure->getSubField("argument.command"); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + startThread(); + return true; +} + +void ProcessRecord::process() +{ + string recordName = pvRecordName->get(); + string command = pvCommand->get(); + if(command.compare("add")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter!=pvRecordMap.end()) { + pvResult->put(recordName + " already present"); + return; + } + PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); + if(!pvRecord) { + pvResult->put(recordName + " not in pvDatabase"); + return; + } + pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); + pvResult->put("success"); + return; + } else if(command.compare("remove")==0) { + epicsGuard guard(mutex); + std::map::iterator iter = pvRecordMap.find(recordName); + if(iter==pvRecordMap.end()) { + pvResult->put(recordName + " not found"); + return; + } + pvRecordMap.erase(iter); + pvResult->put("success"); + return; + } else { + pvResult->put(command + " not a valid command: only add and remove are valid"); + return; + } +} + +void ProcessRecord::run() +{ + while(true) { + if(runStop.tryWait()) { + runReturn.signal(); + return; + } + if(delay>0.0) epicsThreadSleep(delay); + epicsGuard guard(mutex); + PVRecordMap::iterator iter; + for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { + PVRecordPtr pvRecord = (*iter).second; + pvRecord->lock(); + pvRecord->beginGroupPut(); + try { + pvRecord->process(); + } catch (std::exception& ex) { + std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; + } catch (...) { + std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; + } + pvRecord->endGroupPut(); + pvRecord->unlock(); + } + } +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg arg1 = { "delay", iocshArgDouble }; +static const iocshArg *args[] = {&arg0,&arg1}; + +static const iocshFuncDef processRecordFuncDef = {"processRecordCreate", 2,args}; static void processRecordCallFunc(const iocshArgBuf *args) { cerr << "DEPRECATED use pvdbcrProcessRecord instead\n"; - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("processRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("processRecord recordName not specified"); } + string recordName = string(sval); double delay = args[1].dval; if(delay<0.0) delay = 1.0; ProcessRecordPtr record = ProcessRecord::create(recordName,delay); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void processRecordRegister(void) diff --git a/src/special/removeRecord.cpp b/src/special/removeRecord.cpp deleted file mode 100644 index 6bfc975..0000000 --- a/src/special/removeRecord.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* removeRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/pvDatabase.h" -#include "pv/removeRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -RemoveRecordPtr RemoveRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - RemoveRecordPtr pvRecord( - new RemoveRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -RemoveRecord::RemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool RemoveRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void RemoveRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->remove(); - pvResult->put("success"); -} - - -}} diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp index 280ee17..c1a264e 100644 --- a/src/special/removeRecordRegister.cpp +++ b/src/special/removeRecordRegister.cpp @@ -5,12 +5,8 @@ /** * @author mrk - * @date 2013.07.24 + * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ -#include #include #include #include @@ -18,34 +14,107 @@ #include #include #include +#include +#include -// The following must be the last include for code pvDatabase uses #include #define epicsExportSharedSymbols +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" #include "pv/pvDatabase.h" -#include "pv/removeRecord.h" - using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg *testArgs[] = { - &testArg0}; +class RemoveRecord; +typedef std::tr1::shared_ptr RemoveRecordPtr; -static const iocshFuncDef removeRecordFuncDef = {"removeRecordCreate", 1,testArgs}; + +class epicsShareClass RemoveRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(RemoveRecord); + static RemoveRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +private: + RemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVStringPtr pvResult; +}; + +RemoveRecordPtr RemoveRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + RemoveRecordPtr pvRecord( + new RemoveRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +RemoveRecord::RemoveRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + +bool RemoveRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void RemoveRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->remove(); + pvResult->put("success"); +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg *args[] = {&arg0}; + +static const iocshFuncDef removeRecordFuncDef = {"removeRecordCreate", 1,args}; static void removeRecordCallFunc(const iocshArgBuf *args) { cerr << "DEPRECATED use pvdbcrRemoveRecord instead\n"; - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("removeRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("removeRecord recordName not specified"); } + string recordName = string(sval); RemoveRecordPtr record = RemoveRecord::create(recordName); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void removeRecordRegister(void) diff --git a/src/special/traceRecord.cpp b/src/special/traceRecord.cpp deleted file mode 100644 index 1a32bcb..0000000 --- a/src/special/traceRecord.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* traceRecord.cpp */ -/** - * Copyright - See the COPYRIGHT that is included with this distribution. - * EPICS pvData is distributed subject to a Software License Agreement found - * in file LICENSE that is included with this distribution. - */ -/** - * @author mrk - * @date 2013.04.18 - */ - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/traceRecord.h" - -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace std; - -namespace epics { namespace pvDatabase { - -TraceRecordPtr TraceRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - add("level",pvInt)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - TraceRecordPtr pvRecord( - new TraceRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -TraceRecord::TraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - - -bool TraceRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvLevel = pvStructure->getSubField("argument.level"); - if(!pvLevel) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void TraceRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->setTraceLevel(pvLevel->get()); - pvResult->put("success"); -} - - -}} diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp index ce555eb..c4f93ae 100644 --- a/src/special/traceRecordRegister.cpp +++ b/src/special/traceRecordRegister.cpp @@ -5,11 +5,8 @@ /** * @author mrk - * @date 2013.07.24 + * @date 2021.03.12 */ - - -/* Author: Marty Kraimer */ #include #include #include @@ -17,34 +14,113 @@ #include #include #include -#include +#include +#include -// The following must be the last include for code pvDatabase uses +// The following must be the last include #include #define epicsExportSharedSymbols -#include "pv/traceRecord.h" +#include "pv/pvStructureCopy.h" +#include "pv/channelProviderLocal.h" +#include "pv/pvDatabase.h" using namespace epics::pvData; using namespace epics::pvAccess; using namespace epics::pvDatabase; using namespace std; -static const iocshArg testArg0 = { "recordName", iocshArgString }; -static const iocshArg *testArgs[] = { - &testArg0}; +class TraceRecord; +typedef std::tr1::shared_ptr TraceRecordPtr; -static const iocshFuncDef traceRecordFuncDef = {"traceRecordCreate", 1,testArgs}; +class epicsShareClass TraceRecord : + public PVRecord +{ +public: + POINTER_DEFINITIONS(TraceRecord); + static TraceRecordPtr create( + std::string const & recordName); + virtual bool init(); + virtual void process(); +private: + TraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure); + epics::pvData::PVStringPtr pvRecordName; + epics::pvData::PVIntPtr pvLevel; + epics::pvData::PVStringPtr pvResult; +}; + +TraceRecordPtr TraceRecord::create( + std::string const & recordName) +{ + FieldCreatePtr fieldCreate = getFieldCreate(); + PVDataCreatePtr pvDataCreate = getPVDataCreate(); + StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> + addNestedStructure("argument")-> + add("recordName",pvString)-> + add("level",pvInt)-> + endNested()-> + addNestedStructure("result") -> + add("status",pvString) -> + endNested()-> + createStructure(); + PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); + TraceRecordPtr pvRecord( + new TraceRecord(recordName,pvStructure)); + if(!pvRecord->init()) pvRecord.reset(); + return pvRecord; +} + +TraceRecord::TraceRecord( + std::string const & recordName, + epics::pvData::PVStructurePtr const & pvStructure) +: PVRecord(recordName,pvStructure) +{ +} + + +bool TraceRecord::init() +{ + initPVRecord(); + PVStructurePtr pvStructure = getPVStructure(); + pvRecordName = pvStructure->getSubField("argument.recordName"); + if(!pvRecordName) return false; + pvLevel = pvStructure->getSubField("argument.level"); + if(!pvLevel) return false; + pvResult = pvStructure->getSubField("result.status"); + if(!pvResult) return false; + return true; +} + +void TraceRecord::process() +{ + string name = pvRecordName->get(); + PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); + if(!pvRecord) { + pvResult->put(name + " not found"); + return; + } + pvRecord->setTraceLevel(pvLevel->get()); + pvResult->put("success"); +} + +static const iocshArg arg0 = { "recordName", iocshArgString }; +static const iocshArg *args[] = {&arg0}; + +static const iocshFuncDef traceRecordFuncDef = {"traceRecordCreate", 1,args}; static void traceRecordCallFunc(const iocshArgBuf *args) { cerr << "DEPRECATED use pvdbcrTraceRecord instead\n"; - char *recordName = args[0].sval; - if(!recordName) { - throw std::runtime_error("traceRecordCreate invalid number of arguments"); + char *sval = args[0].sval; + if(!sval) { + throw std::runtime_error("traceRecord recordName not specified"); } + string recordName = string(sval); TraceRecordPtr record = TraceRecord::create(recordName); - bool result = PVDatabase::getMaster()->addRecord(record); - if(!result) cout << "recordname" << " not added" << endl; + PVDatabasePtr master = PVDatabase::getMaster(); + bool result = master->addRecord(record); + if(!result) cout << "recordname " << recordName << " not added" << endl; } static void traceRecordRegister(void) From ca066bc088879709f395c218cdc84d7820456150 Mon Sep 17 00:00:00 2001 From: mrkraimer Date: Thu, 1 Apr 2021 10:20:18 -0400 Subject: [PATCH 20/20] addRecord,removeRecord,processRecord.traceRecord replaced by pvdbcr versions --- documentation/RELEASE_NOTES.md | 3 +- src/special/Makefile | 10 -- src/special/addRecordRegister.cpp | 158 ------------------ src/special/addRecordRegister.dbd | 1 - src/special/processRecordRegister.cpp | 222 -------------------------- src/special/processRecordRegister.dbd | 1 - src/special/removeRecordRegister.cpp | 131 --------------- src/special/removeRecordRegister.dbd | 1 - src/special/traceRecordRegister.cpp | 137 ---------------- src/special/traceRecordRegister.dbd | 1 - 10 files changed, 2 insertions(+), 663 deletions(-) delete mode 100644 src/special/addRecordRegister.cpp delete mode 100644 src/special/addRecordRegister.dbd delete mode 100644 src/special/processRecordRegister.cpp delete mode 100644 src/special/processRecordRegister.dbd delete mode 100644 src/special/removeRecordRegister.cpp delete mode 100644 src/special/removeRecordRegister.dbd delete mode 100644 src/special/traceRecordRegister.cpp delete mode 100644 src/special/traceRecordRegister.dbd diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md index 0f13396..641d4a1 100644 --- a/documentation/RELEASE_NOTES.md +++ b/documentation/RELEASE_NOTES.md @@ -2,10 +2,11 @@ This document summarizes the changes to the module between releases. -## Release 4.6.0 (EPICS 7.0.5.* March 2021) +## Release 4.6.0 (EPICS 7.0.5.* April 2021) * Access Security is now supported. * special has been revised and extended. +* addRecord, removeRecord, processRecord, and traceRecord are replaced by pvdbcr versions. * support is DEPRECATED ## Release 4.5.3 (EPICS 7.0.5 Feb 2021) diff --git a/src/special/Makefile b/src/special/Makefile index 95aa467..fe47e3e 100644 --- a/src/special/Makefile +++ b/src/special/Makefile @@ -2,16 +2,6 @@ SRC_DIRS += $(PVDATABASE_SRC)/special -DBD += traceRecordRegister.dbd -DBD += removeRecordRegister.dbd -DBD += addRecordRegister.dbd -DBD += processRecordRegister.dbd - -LIBSRCS += traceRecordRegister.cpp -LIBSRCS += removeRecordRegister.cpp -LIBSRCS += addRecordRegister.cpp -LIBSRCS += processRecordRegister.cpp - DBD += pvdbcrTraceRecordRegister.dbd DBD += pvdbcrRemoveRecordRegister.dbd DBD += pvdbcrAddRecordRegister.dbd diff --git a/src/special/addRecordRegister.cpp b/src/special/addRecordRegister.cpp deleted file mode 100644 index d39d0cd..0000000 --- a/src/special/addRecordRegister.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright information and license terms for this software can be - * found in the file LICENSE that is included with the distribution - */ - -/** - * @author mrk - * @date 2021.03.12 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// The following must be the last include for code exampleLink uses -#include -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/pvDatabase.h" -using std::tr1::static_pointer_cast; -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace epics::pvDatabase; -using namespace std; - -class AddRecord; -typedef std::tr1::shared_ptr AddRecordPtr; - - -class epicsShareClass AddRecord : - public PVRecord -{ -private: - AddRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -public: - POINTER_DEFINITIONS(AddRecord); - - static AddRecordPtr create( - std::string const & recordName); - virtual bool init(); - virtual void process(); -}; - -AddRecordPtr AddRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - addNestedUnion("union") -> - endNested()-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - AddRecordPtr pvRecord( - new AddRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -AddRecord::AddRecord( - std::string const & recordName, - PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool AddRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void AddRecord::process() -{ - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(pvRecord) { - pvResult->put(name + " already exists"); - return; - } - PVUnionPtr pvUnion = getPVStructure()->getSubField("argument.union"); - if(!pvUnion) { - pvResult->put(name + " argument.union is NULL"); - return; - } - PVFieldPtr pvField(pvUnion->get()); - if(!pvField) { - pvResult->put(name + " union has no value"); - return; - } - if(pvField->getField()->getType()!=epics::pvData::structure) { - pvResult->put(name + " union most be a structure"); - return; - } - StructureConstPtr st = static_pointer_cast(pvField->getField()); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(st); - PVRecordPtr pvRec = PVRecord::create(name,pvStructure); - bool result = PVDatabase::getMaster()->addRecord(pvRec); - if(result) { - pvResult->put("success"); - } else { - pvResult->put("failure"); - } -} - -static const iocshArg arg0 = { "recordName", iocshArgString }; -static const iocshArg *args[] = {&arg0}; - -static const iocshFuncDef addRecordFuncDef = {"addRecordCreate", 1,args}; - -static void addRecordCallFunc(const iocshArgBuf *args) -{ - cerr << "DEPRECATED use pvdbcrAddRecord instead\n"; - char *sval = args[0].sval; - if(!sval) { - throw std::runtime_error("addRecordCreate recordName not specified"); - } - string recordName = string(sval); - AddRecordPtr record = AddRecord::create(recordName); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; -} - -static void addRecordCreateRegister(void) -{ - static int firstTime = 1; - if (firstTime) { - firstTime = 0; - iocshRegister(&addRecordFuncDef, addRecordCallFunc); - } -} - -extern "C" { - epicsExportRegistrar(addRecordCreateRegister); -} diff --git a/src/special/addRecordRegister.dbd b/src/special/addRecordRegister.dbd deleted file mode 100644 index 3983cfb..0000000 --- a/src/special/addRecordRegister.dbd +++ /dev/null @@ -1 +0,0 @@ -registrar("addRecordRegister") diff --git a/src/special/processRecordRegister.cpp b/src/special/processRecordRegister.cpp deleted file mode 100644 index 9293b15..0000000 --- a/src/special/processRecordRegister.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - * Copyright information and license terms for this software can be - * found in the file LICENSE that is included with the distribution - */ - -/** - * @author mrk - * @date 2021.03.12 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/pvDatabase.h" -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace epics::pvDatabase; -using namespace std; - -typedef std::tr1::shared_ptr EpicsThreadPtr; -class ProcessRecord; -typedef std::tr1::shared_ptr ProcessRecordPtr; - -class epicsShareClass ProcessRecord : - public PVRecord, - public epicsThreadRunable -{ -public: - POINTER_DEFINITIONS(ProcessRecord); - static ProcessRecordPtr create( - std::string const & recordName,double delay); - virtual bool init(); - virtual void process(); - virtual void run(); - void startThread(); - void stop(); -private: - ProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay); - double delay; - EpicsThreadPtr thread; - epics::pvData::Event runStop; - epics::pvData::Event runReturn; - PVDatabasePtr pvDatabase; - PVRecordMap pvRecordMap; - epics::pvData::PVStringPtr pvCommand; - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; - epics::pvData::Mutex mutex; -}; - -ProcessRecordPtr ProcessRecord::create( - std::string const & recordName,double delay) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("command",pvString)-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - ProcessRecordPtr pvRecord( - new ProcessRecord(recordName,pvStructure,delay)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -void ProcessRecord::startThread() -{ - thread = EpicsThreadPtr(new epicsThread( - *this, - "processRecord", - epicsThreadGetStackSize(epicsThreadStackSmall), - epicsThreadPriorityLow)); - thread->start(); -} - -void ProcessRecord::stop() -{ - runStop.signal(); - runReturn.wait(); -} - - -ProcessRecord::ProcessRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure,double delay) -: PVRecord(recordName,pvStructure), - delay(delay), - pvDatabase(PVDatabase::getMaster()) -{ -} - -bool ProcessRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvCommand = pvStructure->getSubField("argument.command"); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - startThread(); - return true; -} - -void ProcessRecord::process() -{ - string recordName = pvRecordName->get(); - string command = pvCommand->get(); - if(command.compare("add")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter!=pvRecordMap.end()) { - pvResult->put(recordName + " already present"); - return; - } - PVRecordPtr pvRecord = pvDatabase->findRecord(recordName); - if(!pvRecord) { - pvResult->put(recordName + " not in pvDatabase"); - return; - } - pvRecordMap.insert(PVRecordMap::value_type(recordName,pvRecord)); - pvResult->put("success"); - return; - } else if(command.compare("remove")==0) { - epicsGuard guard(mutex); - std::map::iterator iter = pvRecordMap.find(recordName); - if(iter==pvRecordMap.end()) { - pvResult->put(recordName + " not found"); - return; - } - pvRecordMap.erase(iter); - pvResult->put("success"); - return; - } else { - pvResult->put(command + " not a valid command: only add and remove are valid"); - return; - } -} - -void ProcessRecord::run() -{ - while(true) { - if(runStop.tryWait()) { - runReturn.signal(); - return; - } - if(delay>0.0) epicsThreadSleep(delay); - epicsGuard guard(mutex); - PVRecordMap::iterator iter; - for(iter = pvRecordMap.begin(); iter!=pvRecordMap.end(); ++iter) { - PVRecordPtr pvRecord = (*iter).second; - pvRecord->lock(); - pvRecord->beginGroupPut(); - try { - pvRecord->process(); - } catch (std::exception& ex) { - std::cout << "record " << pvRecord->getRecordName() << "exception " << ex.what() << "\n"; - } catch (...) { - std::cout<< "record " << pvRecord->getRecordName() << " process exception\n"; - } - pvRecord->endGroupPut(); - pvRecord->unlock(); - } - } -} - -static const iocshArg arg0 = { "recordName", iocshArgString }; -static const iocshArg arg1 = { "delay", iocshArgDouble }; -static const iocshArg *args[] = {&arg0,&arg1}; - -static const iocshFuncDef processRecordFuncDef = {"processRecordCreate", 2,args}; - -static void processRecordCallFunc(const iocshArgBuf *args) -{ - cerr << "DEPRECATED use pvdbcrProcessRecord instead\n"; - char *sval = args[0].sval; - if(!sval) { - throw std::runtime_error("processRecord recordName not specified"); - } - string recordName = string(sval); - double delay = args[1].dval; - if(delay<0.0) delay = 1.0; - ProcessRecordPtr record = ProcessRecord::create(recordName,delay); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; -} - -static void processRecordRegister(void) -{ - static int firstTime = 1; - if (firstTime) { - firstTime = 0; - iocshRegister(&processRecordFuncDef, processRecordCallFunc); - } -} - -extern "C" { - epicsExportRegistrar(processRecordRegister); -} diff --git a/src/special/processRecordRegister.dbd b/src/special/processRecordRegister.dbd deleted file mode 100644 index fd8f945..0000000 --- a/src/special/processRecordRegister.dbd +++ /dev/null @@ -1 +0,0 @@ -registrar("processRecordRegister") diff --git a/src/special/removeRecordRegister.cpp b/src/special/removeRecordRegister.cpp deleted file mode 100644 index c1a264e..0000000 --- a/src/special/removeRecordRegister.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright information and license terms for this software can be - * found in the file LICENSE that is included with the distribution - */ - -/** - * @author mrk - * @date 2021.03.12 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/pvDatabase.h" -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace epics::pvDatabase; -using namespace std; - -class RemoveRecord; -typedef std::tr1::shared_ptr RemoveRecordPtr; - - -class epicsShareClass RemoveRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(RemoveRecord); - static RemoveRecordPtr create( - std::string const & recordName); - virtual bool init(); - virtual void process(); -private: - RemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVStringPtr pvResult; -}; - -RemoveRecordPtr RemoveRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - RemoveRecordPtr pvRecord( - new RemoveRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -RemoveRecord::RemoveRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - -bool RemoveRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void RemoveRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->remove(); - pvResult->put("success"); -} - -static const iocshArg arg0 = { "recordName", iocshArgString }; -static const iocshArg *args[] = {&arg0}; - -static const iocshFuncDef removeRecordFuncDef = {"removeRecordCreate", 1,args}; - -static void removeRecordCallFunc(const iocshArgBuf *args) -{ - cerr << "DEPRECATED use pvdbcrRemoveRecord instead\n"; - char *sval = args[0].sval; - if(!sval) { - throw std::runtime_error("removeRecord recordName not specified"); - } - string recordName = string(sval); - RemoveRecordPtr record = RemoveRecord::create(recordName); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; -} - -static void removeRecordRegister(void) -{ - static int firstTime = 1; - if (firstTime) { - firstTime = 0; - iocshRegister(&removeRecordFuncDef, removeRecordCallFunc); - } -} - -extern "C" { - epicsExportRegistrar(removeRecordRegister); -} diff --git a/src/special/removeRecordRegister.dbd b/src/special/removeRecordRegister.dbd deleted file mode 100644 index aff2356..0000000 --- a/src/special/removeRecordRegister.dbd +++ /dev/null @@ -1 +0,0 @@ -registrar("removeRecordRegister") diff --git a/src/special/traceRecordRegister.cpp b/src/special/traceRecordRegister.cpp deleted file mode 100644 index c4f93ae..0000000 --- a/src/special/traceRecordRegister.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright information and license terms for this software can be - * found in the file LICENSE that is included with the distribution - */ - -/** - * @author mrk - * @date 2021.03.12 - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// The following must be the last include -#include -#define epicsExportSharedSymbols -#include "pv/pvStructureCopy.h" -#include "pv/channelProviderLocal.h" -#include "pv/pvDatabase.h" - -using namespace epics::pvData; -using namespace epics::pvAccess; -using namespace epics::pvDatabase; -using namespace std; - -class TraceRecord; -typedef std::tr1::shared_ptr TraceRecordPtr; - -class epicsShareClass TraceRecord : - public PVRecord -{ -public: - POINTER_DEFINITIONS(TraceRecord); - static TraceRecordPtr create( - std::string const & recordName); - virtual bool init(); - virtual void process(); -private: - TraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure); - epics::pvData::PVStringPtr pvRecordName; - epics::pvData::PVIntPtr pvLevel; - epics::pvData::PVStringPtr pvResult; -}; - -TraceRecordPtr TraceRecord::create( - std::string const & recordName) -{ - FieldCreatePtr fieldCreate = getFieldCreate(); - PVDataCreatePtr pvDataCreate = getPVDataCreate(); - StructureConstPtr topStructure = fieldCreate->createFieldBuilder()-> - addNestedStructure("argument")-> - add("recordName",pvString)-> - add("level",pvInt)-> - endNested()-> - addNestedStructure("result") -> - add("status",pvString) -> - endNested()-> - createStructure(); - PVStructurePtr pvStructure = pvDataCreate->createPVStructure(topStructure); - TraceRecordPtr pvRecord( - new TraceRecord(recordName,pvStructure)); - if(!pvRecord->init()) pvRecord.reset(); - return pvRecord; -} - -TraceRecord::TraceRecord( - std::string const & recordName, - epics::pvData::PVStructurePtr const & pvStructure) -: PVRecord(recordName,pvStructure) -{ -} - - -bool TraceRecord::init() -{ - initPVRecord(); - PVStructurePtr pvStructure = getPVStructure(); - pvRecordName = pvStructure->getSubField("argument.recordName"); - if(!pvRecordName) return false; - pvLevel = pvStructure->getSubField("argument.level"); - if(!pvLevel) return false; - pvResult = pvStructure->getSubField("result.status"); - if(!pvResult) return false; - return true; -} - -void TraceRecord::process() -{ - string name = pvRecordName->get(); - PVRecordPtr pvRecord = PVDatabase::getMaster()->findRecord(name); - if(!pvRecord) { - pvResult->put(name + " not found"); - return; - } - pvRecord->setTraceLevel(pvLevel->get()); - pvResult->put("success"); -} - -static const iocshArg arg0 = { "recordName", iocshArgString }; -static const iocshArg *args[] = {&arg0}; - -static const iocshFuncDef traceRecordFuncDef = {"traceRecordCreate", 1,args}; - -static void traceRecordCallFunc(const iocshArgBuf *args) -{ - cerr << "DEPRECATED use pvdbcrTraceRecord instead\n"; - char *sval = args[0].sval; - if(!sval) { - throw std::runtime_error("traceRecord recordName not specified"); - } - string recordName = string(sval); - TraceRecordPtr record = TraceRecord::create(recordName); - PVDatabasePtr master = PVDatabase::getMaster(); - bool result = master->addRecord(record); - if(!result) cout << "recordname " << recordName << " not added" << endl; -} - -static void traceRecordRegister(void) -{ - static int firstTime = 1; - if (firstTime) { - firstTime = 0; - iocshRegister(&traceRecordFuncDef, traceRecordCallFunc); - } -} - -extern "C" { - epicsExportRegistrar(traceRecordRegister); -} diff --git a/src/special/traceRecordRegister.dbd b/src/special/traceRecordRegister.dbd deleted file mode 100644 index 4dde906..0000000 --- a/src/special/traceRecordRegister.dbd +++ /dev/null @@ -1 +0,0 @@ -registrar("traceRecordRegister")