This is Unofficial EPICS BASE Doxygen Site
pvDeadbandPlugin.cpp
Go to the documentation of this file.
1 /* pvDeadbandPlugin.cpp */
2 /*
3  * The License for this software can be found in the file LICENSE that is included with the distribution.
4  */
5 #include <stdlib.h>
6 
7 #include <string>
8 #include <map>
9 #include <pv/lock.h>
10 #include <pv/pvData.h>
11 #include <pv/bitSet.h>
12 #include <pv/convert.h>
13 
14 #define epicsExportSharedSymbols
15 #include "pv/pvDeadbandPlugin.h"
16 
17 using std::string;
18 using std::size_t;
19 using std::cout;
20 using std::endl;
22 using std::vector;
23 using namespace epics::pvData;
24 
25 namespace epics { namespace pvCopy{
26 
27 static ConvertPtr convert = getConvert();
28 static std::string name("deadband");
29 
30 PVDeadbandPlugin::PVDeadbandPlugin()
31 {
32 }
33 
34 PVDeadbandPlugin::~PVDeadbandPlugin()
35 {
36 }
37 
38 void PVDeadbandPlugin::create()
39 {
40  static bool firstTime = true;
41  if(firstTime) {
42  firstTime = false;
44  PVPluginRegistry::registerPlugin(name,pvPlugin);
45  }
46 }
47 
48 PVFilterPtr PVDeadbandPlugin::create(
49  const std::string & requestValue,
50  const PVCopyPtr & pvCopy,
51  const PVFieldPtr & master)
52 {
53  return PVDeadbandFilter::create(requestValue,master);
54 }
55 
56 PVDeadbandFilter::~PVDeadbandFilter()
57 {
58 }
59 
60 PVDeadbandFilterPtr PVDeadbandFilter::create(
61  const std::string & requestValue,
62  const PVFieldPtr & master)
63 {
64  FieldConstPtr field =master->getField();
65  Type type = field->getType();
66  if(type!=scalar) return PVDeadbandFilterPtr();
68  if(!ScalarTypeFunc::isNumeric(scalar->getScalarType())) return PVDeadbandFilterPtr();
69  bool absolute = false;
70  if(requestValue.find("abs")==0) {
71  absolute = true;
72  } else if(requestValue.find("rel")==0) {
73  absolute = false;
74  } else {
75  return PVDeadbandFilterPtr();
76  }
77  size_t ind = requestValue.find(':');
78  if(ind==string::npos) return PVDeadbandFilterPtr();
79  string svalue = requestValue.substr(ind+1);
80  double deadband = atof(svalue.c_str());
81  if(deadband==0.0) return PVDeadbandFilterPtr();
82  PVDeadbandFilterPtr filter =
84  new PVDeadbandFilter(
85  absolute,deadband,static_pointer_cast<PVScalar>(master)));
86  return filter;
87 }
88 
89 PVDeadbandFilter::PVDeadbandFilter(bool absolute,double deadband,PVScalarPtr const & master)
90 : absolute(absolute),
91  deadband(deadband),
92  master(master),
93  firstTime(true),
94  lastReportedValue(0.0)
95 {
96 }
97 
98 
99 bool PVDeadbandFilter::filter(const PVFieldPtr & pvCopy,const BitSetPtr & bitSet,bool toCopy)
100 {
101  if(!toCopy) return false;
102  double value = convert->toDouble(master);
103  double diff = value - lastReportedValue;
104  if(diff<0.0) diff = - diff;
105  bool report = true;
106  if(firstTime) {
107  firstTime = false;
108  } else if(absolute) {
109  if(diff<deadband) report = false;
110  } else {
111  double last = lastReportedValue;
112  if(last<0.0) last = -last;
113  if(last>1e-20) {
114  double percent = (diff/last)*100.0;
115  if(percent<deadband) report = false;
116  }
117  }
119  convert->fromDouble(copy,value);
120  if(report) {
121  lastReportedValue = value;
122  bitSet->set(pvCopy->getFieldOffset());
123  } else {
124  bitSet->clear(pvCopy->getFieldOffset());
125  }
126  return true;
127 }
128 
129 string PVDeadbandFilter::getName()
130 {
131  return name;
132 }
133 
134 }}
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
Definition: link.h:174
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
std::tr1::shared_ptr< PVFilter > PVFilterPtr
Definition: pvPlugin.h:29
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:788
pvd::StructureConstPtr type
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
void copy(PVValueArray< T > &pvFrom, size_t fromOffset, size_t fromStride, PVValueArray< T > &pvTo, size_t toOffset, size_t toStride, size_t count)
Copy a subarray from one scalar array to another.
std::tr1::shared_ptr< PVDeadbandFilter > PVDeadbandFilterPtr
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
Definition: pvIntrospect.h:150
pvData
Definition: monitor.h:428
A Plugin for a filter that gets a sub array from a PVScalarDeadband.
#define report
Definition: aaiRecord.c:53
bool isNumeric(ScalarType type)
Definition: TypeFunc.cpp:53
std::tr1::shared_ptr< PVScalar > PVScalarPtr
Definition: pvData.h:77
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
std::tr1::shared_ptr< PVField > PVFieldPtr
Definition: pvData.h:66
std::tr1::shared_ptr< Convert > ConvertPtr
Definition: convert.h:23
std::tr1::shared_ptr< BitSet > BitSetPtr
Definition: bitSet.h:26
A plugin for a filter that gets a sub array from a PVScalarDeadband.
std::tr1::shared_ptr< PVDeadbandPlugin > PVDeadbandPluginPtr