10 #include <pv/pvData.h> 11 #include <pv/bitSet.h> 12 #include <pv/convert.h> 14 #define epicsExportSharedSymbols 21 using std::tr1::static_pointer_cast;
25 namespace epics {
namespace pvCopy{
27 static ConvertPtr convert = getConvert();
28 static std::string name(
"deadband");
30 PVDeadbandPlugin::PVDeadbandPlugin()
34 PVDeadbandPlugin::~PVDeadbandPlugin()
38 void PVDeadbandPlugin::create()
40 static bool firstTime =
true;
44 PVPluginRegistry::registerPlugin(name,pvPlugin);
49 const std::string & requestValue,
51 const PVFieldPtr & master)
53 return PVDeadbandFilter::create(requestValue,master);
56 PVDeadbandFilter::~PVDeadbandFilter()
61 const std::string & requestValue,
62 const PVFieldPtr & master)
64 FieldConstPtr field =master->getField();
65 Type type = field->getType();
67 ScalarConstPtr scalar = static_pointer_cast<
const Scalar>(field);
69 bool absolute =
false;
70 if(requestValue.find(
"abs")==0) {
72 }
else if(requestValue.find(
"rel")==0) {
77 size_t ind = requestValue.find(
':');
79 string svalue = requestValue.substr(ind+1);
80 double deadband = atof(svalue.c_str());
85 absolute,deadband,static_pointer_cast<PVScalar>(master)));
89 PVDeadbandFilter::PVDeadbandFilter(
bool absolute,
double deadband,PVScalarPtr
const & master)
94 lastReportedValue(0.0)
99 bool PVDeadbandFilter::filter(
const PVFieldPtr & pvCopy,
const BitSetPtr & bitSet,
bool toCopy)
101 if(!toCopy)
return false;
102 double value = convert->toDouble(master);
103 double diff = value - lastReportedValue;
104 if(diff<0.0) diff = - diff;
108 }
else if(absolute) {
109 if(diff<deadband) report =
false;
111 double last = lastReportedValue;
112 if(last<0.0) last = -last;
114 double percent = (diff/last)*100.0;
115 if(percent<deadband) report =
false;
118 PVScalarPtr copy = static_pointer_cast<PVScalar>(pvCopy);
119 convert->fromDouble(copy,value);
121 lastReportedValue = value;
122 bitSet->set(pvCopy->getFieldOffset());
124 bitSet->clear(pvCopy->getFieldOffset());
129 string PVDeadbandFilter::getName()
std::tr1::shared_ptr< PVFilter > PVFilterPtr
std::tr1::shared_ptr< PVCopy > PVCopyPtr
std::tr1::shared_ptr< PVDeadbandFilter > PVDeadbandFilterPtr
A Plugin for a filter that gets a sub array from a PVScalarDeadband.
A plugin for a filter that gets a sub array from a PVScalarDeadband.
std::tr1::shared_ptr< PVDeadbandPlugin > PVDeadbandPluginPtr