Files
pvDatabase/src/copy/pvTimestampPlugin.cpp
2018-10-29 14:11:02 -05:00

125 lines
2.9 KiB
C++

/* pvTimestampPlugin.cpp */
/*
* The License for this software can be found in the file LICENSE that is included with the distribution.
*/
#include <pv/pvData.h>
#include <pv/bitSet.h>
#include <pv/convert.h>
#include <pv/pvTimeStamp.h>
#define epicsExportSharedSymbols
#include <pv/pvTimestampPlugin.h>
#include <pv/pvStructureCopy.h>
using std::string;
using std::size_t;
using std::cout;
using std::endl;
using std::tr1::static_pointer_cast;
using std::vector;
using namespace epics::pvData;
namespace epics { namespace pvCopy{
static ConvertPtr convert = getConvert();
static std::string name("timestamp");
PVTimestampPlugin::PVTimestampPlugin()
{
}
PVTimestampPlugin::~PVTimestampPlugin()
{
}
void PVTimestampPlugin::create()
{
static bool firstTime = true;
if(firstTime) {
firstTime = false;
PVTimestampPluginPtr pvPlugin = PVTimestampPluginPtr(new PVTimestampPlugin());
PVPluginRegistry::registerPlugin(name,pvPlugin);
}
}
PVFilterPtr PVTimestampPlugin::create(
const std::string & requestValue,
const PVCopyPtr & pvCopy,
const PVFieldPtr & master)
{
return PVTimestampFilter::create(requestValue,master);
}
PVTimestampFilter::~PVTimestampFilter()
{
}
PVTimestampFilterPtr PVTimestampFilter::create(
const std::string & requestValue,
const PVFieldPtr & master)
{
PVTimeStamp pvTimeStamp;
if(!pvTimeStamp.attach(master)) return PVTimestampFilterPtr();
bool current = false;
bool copy = false;
if(requestValue.compare("current")==0) {
current = true;
} else if(requestValue.compare("copy")==0){
copy = true;
} else {
return PVTimestampFilterPtr();
}
PVTimestampFilterPtr filter = PVTimestampFilterPtr(
new PVTimestampFilter(current,copy,master));
return filter;
}
PVTimestampFilter::PVTimestampFilter(bool current,bool copy,PVFieldPtr const & master)
: current(current),
copy(copy),
master(master)
{
}
bool PVTimestampFilter::filter(const PVFieldPtr & pvCopy,const BitSetPtr & bitSet,bool toCopy)
{
if(current) {
timeStamp.getCurrent();
if(toCopy) {
if(!pvTimeStamp.attach(pvCopy)) return false;
} else {
if(!pvTimeStamp.attach(master)) return false;
}
pvTimeStamp.set(timeStamp);
bitSet->set(pvCopy->getFieldOffset());
return true;
}
if(copy) {
if(toCopy) {
if(!pvTimeStamp.attach(master)) return false;
pvTimeStamp.get(timeStamp);
if(!pvTimeStamp.attach(pvCopy)) return false;
pvTimeStamp.set(timeStamp);
bitSet->set(pvCopy->getFieldOffset());
} else {
if(!pvTimeStamp.attach(pvCopy)) return false;
pvTimeStamp.get(timeStamp);
if(!pvTimeStamp.attach(master)) return false;
pvTimeStamp.set(timeStamp);
}
return true;
}
return false;
}
string PVTimestampFilter::getName()
{
return name;
}
}}