7 #ifndef __EPICS_METRIC__
8 #define __EPICS_METRIC__ 1
10 #include "artdaq-utilities/Plugins/MetricMacros.hh"
11 #include "messagefacility/MessageLogger/MessageLogger.h"
12 #include <unordered_map>
16 #pragma clang diagnostic push
17 #pragma clang diagnostic ignored "-Wunused-parameter"
21 #pragma clang diagnostic pop
36 std::unordered_map<std::string, chid> channels_;
38 bool checkChannel_(std::string name)
40 if (!channels_.count(name))
43 auto sts = ca_search(name.c_str(), &channel);
44 sts = ca_pend_io(5.0);
45 if (sts != ECA_NORMAL)
47 SEVCHK(ca_clear_channel(channel), NULL);
48 mf::LogWarning(
"EPICS Plugin") <<
"Channel " << name <<
" not found!";
49 channels_[name] =
nullptr;
52 channels_[name] = channel;
55 return channels_[name] !=
nullptr;
65 , prefix_(pset.get<std::string>(
"channel_name_prefix",
"artdaq"))
70 MetricPlugin::stopMetrics();
77 std::string
getLibName()
const override {
return "epics"; }
84 for (
auto channel : channels_)
86 SEVCHK(ca_clear_channel(channel.second), NULL);
106 void sendMetric_(
const std::string& name,
const std::string& value,
const std::string& unit)
override
108 std::string caName = prefix_ +
":" + name;
109 std::string tmpValue = value +
" " + unit;
111 if (checkChannel_(caName))
114 if (tmpValue.size() > 40) { tmpValue = tmpValue.erase(40); }
115 SEVCHK(ca_put(DBR_STRING, channels_[caName], tmpValue.c_str()), NULL);
116 SEVCHK(ca_flush_io(), NULL);
130 void sendMetric_(
const std::string& name,
const int& value,
const std::string& unit)
override
133 std::string caName = prefix_ +
":" + name;
136 mf::LogDebug(
"EPICS Plugin") <<
"Not sure if I can send ChannelAccess Units...configure in db instead.";
139 if (checkChannel_(caName))
141 dbr_long_t val =
static_cast<dbr_long_t
>(value);
142 SEVCHK(ca_put(DBR_LONG, channels_[caName], &val), NULL);
143 SEVCHK(ca_flush_io(), NULL);
157 void sendMetric_(
const std::string& name,
const double& value,
const std::string& unit)
override
160 std::string caName = prefix_ +
":" + name;
163 mf::LogDebug(
"EPICS Plugin") <<
"Not sure if I can send ChannelAccess Units...configure in db instead.";
166 if (checkChannel_(caName))
168 dbr_double_t val =
static_cast<dbr_double_t
>(value);
169 SEVCHK(ca_put(DBR_DOUBLE, channels_[caName], &val), NULL);
170 SEVCHK(ca_flush_io(), NULL);
184 void sendMetric_(
const std::string& name,
const float& value,
const std::string& unit)
override
187 std::string caName = prefix_ +
":" + name;
190 mf::LogDebug(
"EPICS Plugin") <<
"Not sure if I can send ChannelAccess Units...configure in db instead.";
193 if (checkChannel_(caName))
195 dbr_float_t val =
static_cast<dbr_float_t
>(value);
196 SEVCHK(ca_put(DBR_FLOAT, channels_[caName], &val), NULL);
197 SEVCHK(ca_flush_io(), NULL);
211 void sendMetric_(
const std::string& name,
const unsigned long int& value,
const std::string& unit)
override
214 std::string caName = prefix_ +
":" + name;
217 mf::LogDebug(
"EPICS Plugin") <<
"Not sure if I can send ChannelAccess Units...configure in db instead.";
220 if (checkChannel_(caName))
222 dbr_ulong_t val =
static_cast<dbr_ulong_t
>(value);
223 SEVCHK(ca_put(DBR_LONG, channels_[caName], &val), NULL);
224 SEVCHK(ca_flush_io(), NULL);
232 #endif //End ifndef __EPICS_METRIC__
void sendMetric_(const std::string &name, const float &value, const std::string &unit) override
Send a float metric data point to ChannelAccess.
void sendMetric_(const std::string &name, const unsigned long int &value, const std::string &unit) override
Send an unsigned integer metric data point to ChannelAccess.
An instance of the MetricPlugin class that sends metric data using the Channel Access protocol from E...
void stopMetrics_() override
Clears the registered ChannelAccess channels.
void startMetrics_() override
No initialization is needed to start sending metrics.
std::string getLibName() const override
Gets the unique library name of this plugin.
EpicsMetric(fhicl::ParameterSet pset)
Construct an instance of the EpicsMetric plugin.
void sendMetric_(const std::string &name, const std::string &value, const std::string &unit) override
Send a string metric data point to ChannelAccess.
void sendMetric_(const std::string &name, const double &value, const std::string &unit) override
Send a double metric data point to ChannelAccess.
void sendMetric_(const std::string &name, const int &value, const std::string &unit) override
Send an integer metric data point to ChannelAccess.